ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhMWI4Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaF8qLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYTcxNmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2ggUjNfMF8xX3BhdGNoZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzOWQ3OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPG1ldGEgbmFtZT0iQnVpbGQiIGNvbnRlbnQ9IkJ1aWxkIj4KLTx0aXRsZT5XVFAgMy4zLjIgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+V1RQIDMuMy4yIFBhdGNoZXM8L2gxPgotCi08aDI+b3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZTwvaDI+Ci0KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzcxMTU1Jz4zNzExNTU8L2E+LiBKQVgtUlMgY29uZmlndXJhdGlvbiBVSSBzaG91bGQgaGF2ZSB0aGUgVXBkYXRlIERlcGxveW1lbnQgZGVzY3JpcHRvciBjaGVjayBib3ggYXZhaWxhYmxlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNzE2NjAnPjM3MTY2MDwvYT4uIFBlcmZvcm1hbmNlIGlzc3VlIHNpbmNlIGRpc3Bvc2UgbWV0aG9kIGlzIG5vdCBiZWluZyBjYWxsZWQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3NjkxMyc+Mzc2OTEzPC9hPi4gU3RhYmlsaXR5IGltcHJvdmVtZW50cyB0byB3ZWIgc2VydmljZXMgY29tbWFuZHMvb3BlcmF0aW9ucyAtIEZvciAzLjMueDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzc3OTE1Jz4zNzc5MTU8L2E+LiBbMzN4XSBUaGUgSkFYLVJTIGluc3RhbGwgb3BlcmF0aW9uIGNvbmZpZyBzaG91bGQgYmUgdXBkYXRlZCB3aGVuZXZlciB0aGVyZSBhcmUgcHJvdmlkZXIgc2V0IGNoYW5nZXM8L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzkxMjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICBib2R5IHsKLSAgICBzaXplOiA4LjVpbiAxMS4waW47Ci0gICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOwotICAgIHRhYi1pbnRlcnZhbDogMC41aW47Ci0gICAgfQotICBwIHsgIAkKLSAgICBtYXJnaW4tbGVmdDogYXV0bzsKLSAgICBtYXJnaW4tdG9wOiAgMC41ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0gICAgfQotICBwLmxpc3QgewotICAJbWFyZ2luLWxlZnQ6IDAuNWluOwotICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07Ci0gICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOwotICAgIH0KLSAgPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQotUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUwotQUdSRUVNRU5ULjwvcD4KLQotPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgotCi08cD4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCi1jb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KLTxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Ci08cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KLW9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCi1Db250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCi1Qcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAotQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKLWFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKLXRoZSBQcm9ncmFtLjwvcD4KLQotPHA+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyZxdW90OyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKLUNvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKLXdpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgotCi08cD4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcwotb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKLUNvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAotcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAotb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKLWxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQotUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCi1zdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAotYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCi1ncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKLWFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKLXBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKLUNvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKLWFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLW9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcwotZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCi1leGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAotdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAotaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Ci10aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KLQotPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKLWZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQ7IGFuZDwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcwotb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvcgotY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycwotYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi1pbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcwotQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIKLXBhcnR5OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQotZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCi1yZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCi1leGNoYW5nZS48L3A+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKLWNvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAotd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KLQotPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCi1yZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUKLWxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZgotdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUKLXBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgotKCZxdW90O0NvbW1lcmNpYWwgQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAotaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykKLWFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspCi1hcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQKLXBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZQotYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCi1vYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4KLW9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeQotdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlCi1JbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93bgotZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKLWNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKLWFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KLWRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKLXBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCi1Db250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi1tdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KLQotPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKLVBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUwotT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKLU9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCi1leGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi10aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAotZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKLWludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKLU5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi1JTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCi1XSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAotSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+Ci0KLTxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCi10aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KLWJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KLWV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKLShpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQotUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgotc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQotZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAotZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKLUFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCi1hZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKLXVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKLXJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQotQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCi1Gb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQotYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQotc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQotZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZwotQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKLWV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCi1yaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKLXRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCi1vdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKLUFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKLXRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQotdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKLXJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDRhYzRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1RQIFBhdGNoZXMgZm9yIG9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1cblwKLVxuXAotVGhlIGZpeGVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBidWd6aWxsYSBlbnRyaWVzOlxuXAotXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3MTE1NSBKQVgtUlMgY29uZmlndXJhdGlvbiBVSSBzaG91bGQgaGF2ZSB0aGUgVXBkYXRlIERlcGxveW1lbnQgZGVzY3JpcHRvciBjaGVjayBib3ggYXZhaWxhYmxlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3MTY2MCBQZXJmb3JtYW5jZSBpc3N1ZSBzaW5jZSBkaXNwb3NlIG1ldGhvZCBpcyBub3QgYmVpbmcgY2FsbGVkXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3NjkxMyBTdGFiaWxpdHkgaW1wcm92ZW1lbnRzIHRvIHdlYiBzZXJ2aWNlcyBjb21tYW5kcy9vcGVyYXRpb25zIC0gRm9yIDMuMy54XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3NzkxNSBbMzN4XSBUaGUgSkFYLVJTIGluc3RhbGwgb3BlcmF0aW9uIGNvbmZpZyBzaG91bGQgYmUgdXBkYXRlZCB3aGVuZXZlciB0aGVyZSBhcmUgcHJvdmlkZXIgc2V0IGNoYW5nZXNcblwKLVxuXAotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotRmVicnVhcnkgMSwgMjAxMVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLVxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCi1cblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCi1cblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZmY3YmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2giCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjIucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4zLjIudjIwMTExMTAzMDUwMC03YjdJSTFZRlNLMldJdVBSREVuRXhQVi1SdlRuIiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4cnMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXhycy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5YzQ4My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ2ZDMwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotZmVhdHVyZS50ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5MmRiNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDI2MGI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxtZXRhIG5hbWU9IkJ1aWxkIiBjb250ZW50PSJCdWlsZCI+Ci08dGl0bGU+V2ViIFRvb2xzIFBsYXRmb3JtIFBhdGNoIEJ1aWxkIE5vdGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMy4zLjIgUGF0Y2hlczwvaDE+Ci0KLTxoMj5vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZTwvaDI+Ci0KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzczMTM2Jz4zNzMxMzY8L2E+LiBBbHdheXMgc2VwYXJhdGUgdGhlIEphdmEgT3V0cHV0IEZvbGRlciBmcm9tIHRoZSBKYXZhIFNvdXJjZSBGb2xkZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3MzIxMCc+MzczMjEwPC9hPi4gSjJFRUZsZXhQcm9qRGVwbG95YWJsZS5pc1NpbmdsZVJvb3RTdHJ1Y3R1cmUoKSBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYW4gRUFSPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNzM0MDInPjM3MzQwMjwvYT4uIE5QRSBpbiBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbCB3aGVuIGNsYXNzcGF0aCBjb250YWluZXIgcmV0dXJucyBudWxsIGZvciBlbnRyaWVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNzY1MDQnPjM3NjUwNDwvYT4uIEluY29ycmVjdCBlcnJvciBtZXNzYWdlIG9uIFJBUi9BcHAgQ2xpZW50IEphciBJbXBvcnQgV2l6YXJkPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNzg1MDcnPjM3ODUwNzwvYT4uIE5QRSB3aGVuIGV4cG9ydGluZyBhbiBFQVIgaWYgb25lIG9mIHRoZSBtb2R1bGVzIGlzIG91dCBvZiBzeW5jaDwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzkxMjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgYm9keSB7Ci0gICAgc2l6ZTogOC41aW4gMTEuMGluOwotICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKLSAgICB0YWItaW50ZXJ2YWw6IDAuNWluOwotICAgIH0KLSAgcCB7ICAJCi0gICAgbWFyZ2luLWxlZnQ6IGF1dG87Ci0gICAgbWFyZ2luLXRvcDogIDAuNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwotICAgIH0KLSAgcC5saXN0IHsKLSAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKLSAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOwotICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKLSAgICB9Ci0gIDwvc3R5bGU+Ci0KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotCi08aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKLVBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKLUFHUkVFTUVOVC48L3A+Ci0KLTxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KLQotPHA+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAotY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+Ci08cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgotPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgotPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCi1vcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQotQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQotUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKLUNvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCi1hcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgotCi08cD4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCi10aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMmcXVvdDsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQotQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCi1Db250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCi13aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKLXRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAotQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCi1yb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKLW9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KLXNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCi1Db250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKLXJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKLW9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50Ci1saWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAotc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKLWJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgotZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCi1hcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCi1wYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCi1Db250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Ci1hbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi1vciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKLWdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgotZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKLXRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKLXRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KLQotPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKLWhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAotdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCi1mb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcwotQWdyZWVtZW50OyBhbmQ8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCi1hbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKLW9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKLWNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKLWFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci0KLTxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKLUFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCi1wYXJ0eTsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKLWZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQotcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQotZXhjaGFuZ2UuPC9wPgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgotCi08cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCi1jb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKLXdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCi1saWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKLXRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCi1wb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKLSgmcXVvdDtDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKLWluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspCi1hZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KQotYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCi1wYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKLWFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQotb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCi1vcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKLXRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQotSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KLWV4cGVuc2UuPC9wPgotCi08cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCi1Db250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCi1jbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5Ci1hbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCi1kZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCi1wZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgotQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+Ci0KLTxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKLU9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCi1PUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cwotZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKLWRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCi1pbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+Ci0KLTxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCi1OT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORwotV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgotRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKLUhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KLQotPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKLWFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgotdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCi1ieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCi1leHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5Ci0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKLVByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKLXNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKLWRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KLQotPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKLWZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCi1BZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQotYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCi11bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCi1yZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKLUFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQotRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKLWFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKLXN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKLWdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCi1leHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubwotcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCi10aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgotb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KLQotPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Ci10byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKLXRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCi1yaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmUzMzFiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdUUCBQYXRjaGVzIGZvciBvcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLVRoZSBidWdzIGFuZCBmaXhlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgYnVnemlsbGEgZW50cmllczpcblwKLVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNzMxMzYgQWx3YXlzIHNlcGFyYXRlIHRoZSBKYXZhIE91dHB1dCBGb2xkZXIgZnJvbSB0aGUgSmF2YSBTb3VyY2UgRm9sZGVyXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3MzIxMCBKMkVFRmxleFByb2pEZXBsb3lhYmxlLmlzU2luZ2xlUm9vdFN0cnVjdHVyZSgpIGFsd2F5cyByZXR1cm5zIGZhbHNlIGZvciBhbiBFQVJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzczNDAyIE5QRSBpbiBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbCB3aGVuIGNsYXNzcGF0aCBjb250YWluZXIgcmV0dXJucyBudWxsIGZvciBlbnRyaWVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM3NjUwNCBJbmNvcnJlY3QgZXJyb3IgbWVzc2FnZSBvbiBSQVIvQXBwIENsaWVudCBKYXIgSW1wb3J0IFdpemFyZFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNzg1MDcgTlBFIHdoZW4gZXhwb3J0aW5nIGFuIEVBUiBpZiBvbmUgb2YgdGhlIG1vZHVsZXMgaXMgb3V0IG9mIHN5bmNoXG5cCi1cblwKLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUZlYnJ1YXJ5IDEsIDIwMTFcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOGVjZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMy4zLjIudjIwMTExMjA3MjA0OS03UTdER0xBRkU5TGVBSEdRd3owWXowTm11aXR6MDF6MDFzUnhpMzg3IiBwYXRjaD0idHJ1ZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOWM0ODMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Ci08dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5GZWJydWFyeSAxLCAyMDExPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKLSAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KLQotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgotCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0KLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmMxYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQyOWMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamR0X2ludGVncmF0aW9uLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjMGJjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2E0ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotI01vbiBKdW4gMDggMTU6MzU6NDUgRURUIDIwMDkKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9ZXJyb3IKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVVbmNoZWNrZWRFeGNlcHRpb25zPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4YWQ5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS41MDIucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luVmVuZG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iMy44LjEiCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWRmMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Yzk3OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiCi0JbmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciIKLQkJZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIKLQkJZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjQ3NWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUludGVncmF0aW9uIFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTA4ZGI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkphdmFDb21wb25lbnREaXNjZXJuZXIiIG5hbWU9IkphdmFDb21wb25lbnREaXNjZXJuZXIiIHNjaGVtYT0ic2NoZW1hL0phdmFDb21wb25lbnREaXNjZXJuZXIuZXhzZCIvPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy53b3JraW5nQ29weU1hbmFnZXIiCi0gICAgICAgICBuYW1lPSJXb3JraW5nIENvcHkgTWFuYWdlciAtIEhlYWRsZXNzIENvbnRleHQgQ2xhc3MiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9IndvcmtpbmdDb3B5TWFuYWdlciIKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5XVFBXb3JraW5nQ29weU1hbmFnZXIiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSJqYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBuYW1lPSJqYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIiPgotICAgICAgPHZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyCi0gICAgICAgIGlkPSJqYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBoYW5kbGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLkphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIiCi0gICAgICAgIHNlbGVjdGlvblR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsIj4KLSAgICAgIDxlZGl0TW9kZWwKLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3QudXRpbGl0eSIKLSAgICAgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeSI+Ci0gICAgICA8L2VkaXRNb2RlbD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmludGVybmFsLkphdmFGYWNldEluc3RhbGxDb25maWdUb0RhdGFNb2RlbEFkYXB0ZXIiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZyI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgPGZhY3RvcnkgCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmludGVybmFsLkRhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWciLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUucmVmZXJlbmNlUmVzb2x2ZXIiPgotICAgICA8cmVzb2x2ZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5DbGFzc3BhdGhDb250YWluZXJSZWZlcmVuY2VSZXNvbHZlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5jbGFzc3BhdGhDb250YWluZXJSZXNvbHZlciI+Ci0gICAgIDwvcmVzb2x2ZXI+Ci0gIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvSmF2YUNvbXBvbmVudERpc2Nlcm5lci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0phdmFDb21wb25lbnREaXNjZXJuZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5ODYwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvSmF2YUNvbXBvbmVudERpc2Nlcm5lci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiIGlkPSJKYXZhQ29tcG9uZW50RGlzY2VybmVyIiBuYW1lPSJKYXZhQ29tcG9uZW50RGlzY2VybmVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBpbnRlcm5hbD0idHJ1ZSIgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGlzY2VybmVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRpc2Nlcm5lciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLlBvc3NpYmxlTWFuaWZlc3RFbnRyeVV0aWwkTWFuaWZlc3RFbnRyeURpc2Nlcm5lciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vZnJhbWV3b3Jrcy9Db21tb25GcmFtZXdvcmtzUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9mcmFtZXdvcmtzL0NvbW1vbkZyYW1ld29ya3NQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4OTBiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9mcmFtZXdvcmtzL0NvbW1vbkZyYW1ld29ya3NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tb25GcmFtZXdvcmtzUGx1Z2luIAotCi0gICAgZXh0ZW5kcyBXVFBQbHVnaW4KLQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1VSQ0VfRk9MREVSID0gImRlZmF1bHRTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZPTERFUiA9ICJvdXRwdXRGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0gICAKLSAgICBwcml2YXRlIHN0YXRpYyBDb21tb25GcmFtZXdvcmtzUGx1Z2luIGluc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBsdWdpbiBzaW5nbGV0b24uCi0gICAgICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDb21tb25GcmFtZXdvcmtzUGx1Z2luIGdldERlZmF1bHQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbnN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbigpIHsKLSAgICAJc3VwZXIoKTsKLQkJaWYgKGluc3QgPT0gbnVsbCkKLQkJCWluc3QgPSB0aGlzOwotCX0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgCi0gICAgewotICAgICAgICByZXR1cm4gUExVR0lOX0lEOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBJTG9nIGxvZyA9IENvbW1vbkZyYW1ld29ya3NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIkVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGxvZy5sb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOwotCX0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0FkZENsYXNzcGF0aEZvbGRlcnNQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIyMzEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRWaXJ0dWFsQ29tcG9uZW50LkZsYXRDb21wb25lbnRUYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEFkZCBjbGFzc3BhdGggZm9sZGVyIHJlZmVyZW5jZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgCi0gKiB0aGVzZSBjbGFzc3BhdGggZm9sZGVyIHJlZmVyZW5jZXMgYXJlIG5vdCBleGFjdGx5IHN0b3JlZCBhcyAKLSAqIElWaXJ0dWFsUmVmZXJlbmNlIG9iamVjdHMgcGVyc2lzdGVkIGluIHRoZSBjb21wb25lbnQueG1sLCBidXQgcmF0aGVyIAotICogcHVsbGVkIGluIGZyb20gYW5vdGhlciBtb2RlbC4gCi0gKiAKLSAqIEBhdXRob3Igcm9iLnN0cnlrZXJAamJvc3MuY29tCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50IGV4dGVuZHMgQWJzdHJhY3RGbGF0dGVuUGFydGljaXBhbnQgewotCXByaXZhdGUgTGlzdDxJRmxhdFJlc291cmNlPiBsaXN0OwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNob3VsZElnbm9yZVJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LAotCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlZCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYoIChyb290Q29tcG9uZW50IGluc3RhbmNlb2YgSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlcikgJiYgCi0JCQkocmVmZXJlbmNlZC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkgJiYKLQkJCSgoSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQpcmVmZXJlbmNlZC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpLmlzQ2xhc3NGb2xkZXIoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmluYWxpemUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LAotCQkJRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsIExpc3Q8SUZsYXRSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCXRoaXMubGlzdCA9IHJlc291cmNlczsKLQkJaWYoICEoY29tcG9uZW50IGluc3RhbmNlb2YgSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlciApKQotCQkJcmV0dXJuOwotCQkvLyBBZGQgYWxsIEphdmEgb3V0cHV0IGZvbGRlcnMgdGhhdCBoYXZlIHB1Ymxpc2gvZXhwb3J0IGF0dHJpYnV0ZXMKLQkJdHJ5IHsKLQkJCWFkZENsYXNzRm9sZGVyRGVwZW5kZW5jaWVzKChJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyKWNvbXBvbmVudCk7Ci0JCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc0ZvbGRlckRlcGVuZGVuY2llcyhmaW5hbCBJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyIGNvbXBvbmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9IGNvbXBvbmVudC5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcFJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSBjcFJlZiA9IGNwUmVmc1tpXTsKLQkJCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IGNwUmVmLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IGNwUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAoY29tcCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50KSB7Ci0JCQkJCWZpbmFsIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50IGNwQ29tcCA9IChJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkgY29tcDsKLQkJCQkJaWYgKGNwQ29tcC5pc0NsYXNzRm9sZGVyKCkgJiYgY3BDb21wLmdldENsYXNzRm9sZGVyKCkgIT0gbnVsbCkgewotCQkJCQkJSVBhdGggdGFyZ2V0UGF0aCA9IG51bGw7Ci0JCQkJCQl0YXJnZXRQYXRoID0gcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQkJCQlmaW5hbCBJQ29udGFpbmVyIGNvbnRhaW5lciA9IGNwQ29tcC5nZXRDbGFzc0ZvbGRlcigpOwotCQkJCQkJbmV3IFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eShsaXN0LCBudWxsKS5hZGRDb250YWluZXIoY29udGFpbmVyLCB0YXJnZXRQYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQWRkQ2xhc3NwYXRoTGliUmVmZXJlbmNlc1BhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0FkZENsYXNzcGF0aExpYlJlZmVyZW5jZXNQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTEwNzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQWRkQ2xhc3NwYXRoTGliUmVmZXJlbmNlc1BhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LlZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudC5GbGF0Q29tcG9uZW50VGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotLyoqCi0gKiBDb3B5IHRoZSBjbGFzc3BhdGggTElCIHJlZmVyZW5jZXMgZnJvbSBhIGNoaWxkIHdpdGggCi0gKiBhIC4uLyBydW50aW1lIHBhdGggaW50byBhIHJlY2VpdmluZyBwYXJlbnQuCi0gKiAKLSAqIEBhdXRob3Igcm9iCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQWRkQ2xhc3NwYXRoTGliUmVmZXJlbmNlc1BhcnRpY2lwYW50IGV4dGVuZHMgQWJzdHJhY3RGbGF0dGVuUGFydGljaXBhbnQgewotCXByaXZhdGUgTGlzdDxJRmxhdFJlc291cmNlPiBsaXN0OwotCQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSWdub3JlUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQsCi0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2VkLCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAocmVmZXJlbmNlZC5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChJQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpbmFsaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLQkJCUZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsLCBMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcykgewotCQl0aGlzLmxpc3QgPSByZXNvdXJjZXM7Ci0JCWlmKCAhKGNvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIgKSkKLQkJCXJldHVybjsKLQkJaWYoICgoSUNsYXNzcGF0aERlcGVuZGVuY3lSZWNlaXZlciljb21wb25lbnQpLmNhblJlY2VpdmVDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKSkKLQkJCWFkZFJlZmVyZW5jZWRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKElDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIpY29tcG9uZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUmVmZXJlbmNlZENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhmaW5hbCBJQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyIGNvbXBvbmVudCkgewotCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQkJCS8vIGlmIHRoZSByZWZlcmVuY2UgY2Fubm90IGV4cG9ydCBkZXBlbmRlbmNpZXMsIHNraXAKLQkJCWlmKCAhKHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyKSApCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmICghcmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpICYmIHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyKSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIHJlZmVyZW5jZWRDb21wb25lbnQpLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgY3BSZWYgPSBjcFJlZnNbal07Ci0JCQkJCUlQYXRoIGNwUmVmUnVudGltZVBhdGggPSBjcFJlZi5nZXRSdW50aW1lUGF0aCgpOwotCi0JCQkJCWlmIChjcFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkgewotCQkJCQkJLy8gd2FudCB0byBhdm9pZCBhZGRpbmcgZHVwcwotCQkJCQkJSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQgY3BDb21wID0gKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50KSBjcFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQkvLyBkb24ndCB3YW50IHRvIHByb2Nlc3MgY2xhc3MgZm9sZGVyIHJlZnMgaGVyZQotCQkJCQkJaWYgKGNwQ29tcC5pc0NsYXNzRm9sZGVyKCkpCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJCS8vaWYgcGF0aCBpc24ndCAuLi8sIGl0IHNob3VsZG4ndCBiZSBhZGRlZCBoZXJlIFtidWcgMjQ3MDkwXQotCQkJCQkJaWYgKCFjcFJlZlJ1bnRpbWVQYXRoLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChJQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUikpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQkKLQkJCQkJCS8vIFRPRE86IHZlcmlmeSB0aGlzIGNwUmVmUnVudGltZVBhdGggaXMgYWNjZXB0YWJsZT8KLQkJCQkJCS8vaWYoICFydW50aW1lUGF0aC5lcXVhbHMoY29tcG9uZW50LmdldENsYXNzcGF0aEZvbGRlclBhdGgoY3BDb21wKSkpIGNvbnRpbnVlOwotCQkJCQkJCi0JCQkJCQljcFJlZlJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGguYXBwZW5kKGNwUmVmUnVudGltZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQkJCQluZXcgVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5KGxpc3QsIG51bGwpLmFkZEZpbGUoY3BDb21wLCBjcFJlZlJ1bnRpbWVQYXRoLCBjcENvbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlZFByb2plY3RDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUNsYXNzcGF0aERlcGVuZGVuY3lSZWNlaXZlciBjb21wb25lbnQsIEZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHZhbGlkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQotCQkJLy8gaWYgdGhlIHJlZmVyZW5jZSBjYW5ub3QgZXhwb3J0IGRlcGVuZGVuY2llcywgc2tpcAotCQkJaWYoICEocmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpICkKLQkJCQljb250aW51ZTsKLQkJCQotCQkJaWYgKCFyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIHsKLQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9ICgoSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlcikgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNwUmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSBjcFJlZiA9IGNwUmVmc1tqXTsKLQkJCQkJSVBhdGggY3BSZWZSdW50aW1lUGF0aCA9IGNwUmVmLmdldFJ1bnRpbWVQYXRoKCk7Ci0KLQkJCQkJLy8gVE9ETzogQ3JlYXRlIGEgbmV3IGludGVyZmFjZSBsaWtlIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50IGJ1dCBmb3IgcHJvamVjdCByZWZlcmVuY2VzCi0JCQkJCWlmICghKGNwUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50KSkgewotCi0JCQkJCQkvL2lmIHBhdGggaXNuJ3QgLi4vLCBpdCBzaG91bGRuJ3QgYmUgYWRkZWQgaGVyZSBbYnVnIDI0NzA5MF0KLQkJCQkJCWlmICghY3BSZWZSdW50aW1lUGF0aC50b1N0cmluZygpLnN0YXJ0c1dpdGgoSUNsYXNzcGF0aERlcGVuZGVuY3lSZWNlaXZlci5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQkJCQkKLQkJCQkJCXZhbGlkUmVmZXJlbmNlcy5hZGQobmV3IENsYXNzcGF0aExpYlZpcnR1YWxSZWZlcmVuY2UoY3BSZWYpKTsKLQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZFJlZmVyZW5jZXM7Ci0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gZ2V0Q2hpbGRNb2R1bGVzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwpewotCQlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiByZXN1bHQgPSBudWxsOwotCQlpZiggIShjb21wb25lbnQgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyICkpCi0JCQlyZXR1cm4gbnVsbDsJCQotCQkvLyBHYXRoZXIgcHJvamVjdCBjbGFzc3BhdGggZGVwZW5kZW5jaWVzIGZyb20gY2hpbGQgcmVmZXJlbmNlcwotCQlpZiggKChJQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyKWNvbXBvbmVudCkuY2FuUmVjZWl2ZUNsYXNzcGF0aERlcGVuZGVuY2llcygpKQotCQkJcmVzdWx0ID0gZ2V0UmVmZXJlbmNlZFByb2plY3RDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKElDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIpY29tcG9uZW50LCBkYXRhTW9kZWwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvLyBJbm5lciBjbGFzcyB1c2VkIGFzIGEgd3JhcHBlciBmb3IgVmlydHVhbFJlZmVyZW5jZXMsIGRlbGVnYXRpbmcgbW9zdCBvZiB0aGUgbWV0aG9kcyB0byB0aGUgd3JhcHBlZCBvYmplY3QsIGV4Y2VwdAotCS8vIHRoZSBnZXRSdW50aW1lUGF0aCgpIG1ldGhvZC4gVGhpcyBpcyBuZWVkZWQgc28gYSByZWZlcmVuY2UgdG8gYSB2aXJ0dWFsIGNvbXBvbmVudCBjYW4gYmUgYWRkZWQgY29ycmVjdGx5IHRvIHRoZSByZWNlaXZpbmcgcGFyZW50ICAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc3BhdGhMaWJWaXJ0dWFsUmVmZXJlbmNlIGltcGxlbWVudHMgSVZpcnR1YWxSZWZlcmVuY2V7Ci0JCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2UgcmVmOwotCQlDbGFzc3BhdGhMaWJWaXJ0dWFsUmVmZXJlbmNlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZil7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQlyZWYuY3JlYXRlKHVwZGF0ZUZsYWdzLCBhTW9uaXRvcik7CQkJCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCQlyZXR1cm4gcmVmLmV4aXN0cygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZSgpIHsKLQkJCXJldHVybiByZWYuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVwZW5kZW5jeVR5cGUoKSB7Ci0JCQlyZXR1cm4gcmVmLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkgewotCQkJcmV0dXJuIHJlZi5nZXRFbmNsb3NpbmdDb21wb25lbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgewotCQkJcmV0dXJuIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKSB7Ci0JCQkvLyByZW1vdmUgdGhlIC4uLyBwb3J0aW9uIG9mIHRoZSBwYXRoCi0JCQlyZXR1cm4gcmVmLmdldFJ1bnRpbWVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVyaXZlZCgpIHsKLQkJCXJldHVybiByZWYuaXNEZXJpdmVkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgYXJjaGl2ZU5hbWUpIHsKLQkJCXJlZi5zZXRBcmNoaXZlTmFtZShhcmNoaXZlTmFtZSk7Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldERlcGVuZGVuY3lUeXBlKGludCBhRGVwZW5kZW5jeVR5cGUpIHsKLQkJCXJlZi5zZXREZXBlbmRlbmN5VHlwZShhRGVwZW5kZW5jeVR5cGUpOwotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29tcG9uZW50KAotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQsIEVPYmplY3QgZGVwZW5kZW50T2JqZWN0KSB7Ci0JCQlyZWYuc2V0UmVmZXJlbmNlZENvbXBvbmVudChyZWZlcmVuY2VkQ29tcG9uZW50LCBkZXBlbmRlbnRPYmplY3QpOwotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lUGF0aChJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJCXJlZi5zZXRSdW50aW1lUGF0aChhUnVudGltZVBhdGgpOwotCQl9Ci0JfQotCQotLy8JcHJpdmF0ZSBib29sZWFuIGNhbkV4cG9ydENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLS8vCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLS8vCQkvLyBjaGVjayBmb3IgdmFsaWQgcHJvamVjdCB0eXBlCi0vLwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpIAotLy8JCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpCi0vLwkJCQl8fCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0KQotLy8gICAgCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHByb2plY3QpKSB7Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0FkZENsYXNzcGF0aExpYlJlZnNQcm92aWRlclBhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0FkZENsYXNzcGF0aExpYlJlZnNQcm92aWRlclBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Nzk0NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9BZGRDbGFzc3BhdGhMaWJSZWZzUHJvdmlkZXJQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRWaXJ0dWFsQ29tcG9uZW50LkZsYXRDb21wb25lbnRUYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIENvbGxlY3QgdGhlIGNsYXNzcGF0aCBMSUIgcmVmZXJlbmNlcyBmcm9tIGEgZGVwZW5kZW5jeSBwcm92aWRlcgotICogYW5kIGFkZCB0byB0aGUgbWVtYmVycyBsaXN0LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRDbGFzc3BhdGhMaWJSZWZzUHJvdmlkZXJQYXJ0aWNpcGFudCBleHRlbmRzIEFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50IHsKLQlwcml2YXRlIExpc3Q8SUZsYXRSZXNvdXJjZT4gbGlzdDsKLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaW5hbGl6ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwgTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJdGhpcy5saXN0ID0gcmVzb3VyY2VzOwotCQkKLQkJaWYgKCEoY29tcG9uZW50IGluc3RhbmNlb2YgSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlcikpCi0JCQlyZXR1cm47Ci0JCQotCQlhZGRSZWZlcmVuY2VkQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKChJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyKWNvbXBvbmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZmVyZW5jZWRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlciBjb21wb25lbnQpIHsKLQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSBjb21wb25lbnQuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGNwUmVmID0gY3BSZWZzW2pdOwotCQkJSVBhdGggY3BSZWZSdW50aW1lUGF0aCA9IGNwUmVmLmdldFJ1bnRpbWVQYXRoKCk7Ci0KLQkJCWlmIChjcFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkgewotCQkJCS8vIHdhbnQgdG8gYXZvaWQgYWRkaW5nIGR1cHMKLQkJCQlJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCBjcENvbXAgPSAoSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQpIGNwUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkvLyBkb24ndCB3YW50IHRvIHByb2Nlc3MgY2xhc3MgZm9sZGVyIHJlZnMgaGVyZQotCQkJCWlmIChjcENvbXAuaXNDbGFzc0ZvbGRlcigpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChjcFJlZlJ1bnRpbWVQYXRoLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChJQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJbmV3IFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eShsaXN0LCBudWxsKS5hZGRGaWxlKGNwQ29tcCwgY3BSZWZSdW50aW1lUGF0aCwgY3BDb21wKTsKLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQWRkTWFwcGVkT3V0cHV0Rm9sZGVyc1BhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0FkZE1hcHBlZE91dHB1dEZvbGRlcnNQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjYxNGFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQWRkTWFwcGVkT3V0cHV0Rm9sZGVyc1BhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLklKYXZhUHJvamVjdExpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGUuSmF2YUNvcmVMaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLkphdmFMaXRlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZpbHRlclJlc291cmNlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuRmxhdFZpcnR1YWxDb21wb25lbnQuRmxhdENvbXBvbmVudFRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdHRlblBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LlZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5WaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkuU2hvdWxkSW5jbHVkZVV0aWxpdHlDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkTWFwcGVkT3V0cHV0Rm9sZGVyc1BhcnRpY2lwYW50IGV4dGVuZHMgQWJzdHJhY3RGbGF0dGVuUGFydGljaXBhbnQgaW1wbGVtZW50cyBTaG91bGRJbmNsdWRlVXRpbGl0eUNhbGxiYWNrIHsKLQlwcml2YXRlIExpc3Q8SUZsYXRSZXNvdXJjZT4gbGlzdDsKLQlwcml2YXRlIFN0cmluZ1tdIGZpbHRlcmVkU3VmZml4ZXMgPSBuZXcgU3RyaW5nW117fTsgCi0JCi0JcHVibGljIEFkZE1hcHBlZE91dHB1dEZvbGRlcnNQYXJ0aWNpcGFudCgpIHsKLQkJLy8gaW50ZW50aW9uYWxseSBibGFuawotCX0KLQotCXB1YmxpYyBBZGRNYXBwZWRPdXRwdXRGb2xkZXJzUGFydGljaXBhbnQoU3RyaW5nW10gZmlsdGVyZWQpIHsKLQkJdGhpcy5maWx0ZXJlZFN1ZmZpeGVzID0gZmlsdGVyZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3VsZEFkZENvbXBvbmVudEZpbGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJRmxhdEZpbGUgZmlsZSkgewotCQlJRmxhdHRlblBhcnRpY2lwYW50W10gZGVsZWdhdGVzID0gZ2V0RGVsZWdhdGVQYXJ0aWNpcGFudHMoKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZXMubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZighZGVsZWdhdGVzW2ldLnNob3VsZEFkZEV4cG9ydGFibGVGaWxlKG51bGwsIGNvbXBvbmVudCwgbnVsbCwgZmlsZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgSUZsYXR0ZW5QYXJ0aWNpcGFudFtdIGdldERlbGVnYXRlUGFydGljaXBhbnRzKCkgewotCQlyZXR1cm4gbmV3IElGbGF0dGVuUGFydGljaXBhbnRbXSB7Ci0JCQkJRmlsdGVyUmVzb3VyY2VQYXJ0aWNpcGFudC5jcmVhdGVTdWZmaXhGaWx0ZXJQYXJ0aWNpcGFudChmaWx0ZXJlZFN1ZmZpeGVzKQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpbmFsaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLQkJCUZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsLCBMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcykgewotCQl0aGlzLmxpc3QgPSByZXNvdXJjZXM7Ci0JCWxpc3QuZ2V0Q2xhc3MoKTsKLQkJaWYoICFpc0FwcHJvdmVkQ29tcG9uZW50KGNvbXBvbmVudCkpCi0JCQlyZXR1cm47Ci0KLQkJSGFzaE1hcDxJQ29udGFpbmVyLCBJUGF0aD4gbWFwcGVkID0gZ2V0TWFwcGVkSmF2YU91dHB1dENvbnRhaW5lcnMoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCUl0ZXJhdG9yPElDb250YWluZXI+IGkgPSBtYXBwZWQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCUlDb250YWluZXIgbmV4dCA9IGkubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQluZXcgVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5KGxpc3QsIHRoaXMpLmFkZENvbnRhaW5lcihuZXh0LCBtYXBwZWQuZ2V0KG5leHQpKTsKLQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UpIHt9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHByb3ZlZENvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCB2YykgewotCQkvLyBUT0RPCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSGFzaE1hcDxJQ29udGFpbmVyLCBJUGF0aD4gZ2V0TWFwcGVkSmF2YU91dHB1dENvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlDb21wb25lbnRSZXNvdXJjZVByb3h5W10gcHJveGllcyA9IGZpbmRBbGxNYXBwaW5nUHJveGllcyhwcm9qZWN0KTsKLQkJSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUgPSBKYXZhQ29yZUxpdGUuY3JlYXRlKHByb2plY3QpOwotCi0JCUhhc2hNYXA8SUNvbnRhaW5lciwgSVBhdGg+IG1hcCA9IG5ldyBIYXNoTWFwPElDb250YWluZXIsIElQYXRoPigpOwotCQlJRmlsZSBjbGFzc3BhdGhGaWxlID0gcHJvamVjdC5nZXRGaWxlKEphdmFQcm9qZWN0LkNMQVNTUEFUSF9GSUxFTkFNRSk7Ci0JCWlmKCBqYXZhUHJvamVjdExpdGUuZXhpc3RzKCkgJiYgY2xhc3NwYXRoRmlsZS5leGlzdHMoKSkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGVudHJpZXMpIHsKLQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJSVBhdGggY3BlUGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm94aWVzLmxlbmd0aDsgaSsrICkgewotCQkJCQkJaWYoIGNwZVBhdGguZXF1YWxzKG5ldyBQYXRoKHByb2plY3QuZ2V0TmFtZSgpKS5hcHBlbmQocHJveGllc1tpXS5zb3VyY2UpLm1ha2VBYnNvbHV0ZSgpKSkgewotCQkJCQkJCUlDb250YWluZXIgb3V0cHV0Q29udGFpbmVyID0gSmF2YUxpdGVVdGlsaXRpZXMuZ2V0SmF2YU91dHB1dENvbnRhaW5lcihqYXZhUHJvamVjdExpdGUsIGVudHJ5KTsKLQkJCQkJCQlpZiAoIW1hcC5jb250YWluc0tleShvdXRwdXRDb250YWluZXIpKSB7Ci0JCQkJCQkJCW1hcC5wdXQob3V0cHV0Q29udGFpbmVyLCBwcm94aWVzW2ldLnJ1bnRpbWVQYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBUT0RPIAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JLyogCi0JICogVGhpcyBjb2RlIGJlbG93IGlzIGFsc28gZHVwbGljYXRlZCBpbiBjb21tb24udWkgaW4gdGhlIGdlbmVyaWMgcGFnZQotCSAqIHRvIGhhbmRsZSBtb2R1bGUgYXNzZW1ibHkgCi0JICovCi0JCi0JcHVibGljIHN0YXRpYyBDb21wb25lbnRSZXNvdXJjZVByb3h5W10gZmluZEFsbE1hcHBpbmdQcm94aWVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQ29tcG9uZW50UmVzb3VyY2VbXSBhbGxNYXBwaW5ncyA9IGZpbmRBbGxNYXBwaW5ncyhwcm9qZWN0KTsKLQkJQ29tcG9uZW50UmVzb3VyY2VQcm94eVtdIHByb3hpZXMgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VQcm94eVthbGxNYXBwaW5ncy5sZW5ndGhdOwotCQlmb3IoIGludCBpID0gMDsgaSA8IGFsbE1hcHBpbmdzLmxlbmd0aDsgaSsrICkgewotCQkJcHJveGllc1tpXSA9IG5ldyBDb21wb25lbnRSZXNvdXJjZVByb3h5KAotCQkJCQlhbGxNYXBwaW5nc1tpXS5nZXRTb3VyY2VQYXRoKCksIAotCQkJCQlhbGxNYXBwaW5nc1tpXS5nZXRSdW50aW1lUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gcHJveGllczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRBbGxNYXBwaW5ncyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBzdHJ1Y3R1cmVFZGl0LmdldENvbXBvbmVudCgpOwotCQkJT2JqZWN0W10gYXJyID0gY29tcG9uZW50LmdldFJlc291cmNlcygpLnRvQXJyYXkoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzdWx0ID0gbmV3IENvbXBvbmVudFJlc291cmNlW2Fyci5sZW5ndGhdOwotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKysgKQotCQkJCXJlc3VsdFtpXSA9IChDb21wb25lbnRSZXNvdXJjZSlhcnJbaV07Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiggc3RydWN0dXJlRWRpdCAhPSBudWxsICkKLQkJCQlzdHJ1Y3R1cmVFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvbmVudFJlc291cmNlW117fTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb21wb25lbnRSZXNvdXJjZVByb3h5IHsKLQkJcHVibGljIElQYXRoIHNvdXJjZSwgcnVudGltZVBhdGg7Ci0JCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVByb3h5KElQYXRoIHNvdXJjZSwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5ydW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQ2xhc3NwYXRoQ29udGFpbmVyUmVmZXJlbmNlUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQ2xhc3NwYXRoQ29udGFpbmVyUmVmZXJlbmNlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MmUxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0NsYXNzcGF0aENvbnRhaW5lclJlZmVyZW5jZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc29sdmVycy5JUmVmZXJlbmNlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoQ29udGFpbmVyUmVmZXJlbmNlUmVzb2x2ZXIgaW1wbGVtZW50cyBJUmVmZXJlbmNlUmVzb2x2ZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MID0gUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRV9QUk9UT0NPTAotCQkrSVBhdGguU0VQQVJBVE9SICsgQ2xhc3NwYXRoQ29udGFpbmVyVmlydHVhbENvbXBvbmVudC5DTEFTU1BBVEhfQ09OICsgSVBhdGguU0VQQVJBVE9SOwotCXB1YmxpYyBib29sZWFuIGNhblJlc29sdmUoSVZpcnR1YWxDb21wb25lbnQgY29udGV4dCwKLQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCkgewotCQlVUkkgdXJpID0gcmVmZXJlbmNlZENvbXBvbmVudC5nZXRIYW5kbGUoKTsKLQkJaWYoIHVyaS5zZWdtZW50Q291bnQoKSA+IDIgJiYgdXJpLnNlZ21lbnQoMCkuZXF1YWxzKENsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQuQ0xBU1NQQVRIKQotCQkJCSYmIHVyaS5zZWdtZW50KDEpLmVxdWFscyhDbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50LkNPTikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZSByZXNvbHZlKElWaXJ0dWFsQ29tcG9uZW50IGNvbnRleHQsCi0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJVVJJIHVyaSA9IHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCk7Ci0JCWlmKCB1cmkuc2VnbWVudENvdW50KCkgPiAyICYmIHVyaS5zZWdtZW50KDApLmVxdWFscyhDbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50LkNMQVNTUEFUSCkKLQkJCQkmJiB1cmkuc2VnbWVudCgxKS5lcXVhbHMoQ2xhc3NwYXRoQ29udGFpbmVyVmlydHVhbENvbXBvbmVudC5DT04pKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IHVyaS50b1N0cmluZygpLnN1YnN0cmluZyhQUk9UT0NPTC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBuZXcgVmlydHVhbFJlZmVyZW5jZShjb250ZXh0LCAKLSAgICAgICAgICAgIAkJbmV3IENsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQoY29udGV4dC5nZXRQcm9qZWN0KCksIGNvbnRleHQsIHBhdGgpKTsKLSAgICAgICAgICAgIHJlZi5zZXRBcmNoaXZlTmFtZShyZWZlcmVuY2VkQ29tcG9uZW50LmdldEFyY2hpdmVOYW1lKCkpOwotICAgICAgICAgICAgcmVmLnNldFJ1bnRpbWVQYXRoKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0UnVudGltZVBhdGgoKSk7Ci0gICAgICAgICAgICByZWYuc2V0RGVwZW5kZW5jeVR5cGUocmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbmN5VHlwZSgpLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXNvbHZlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlpZiggcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIENsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQgKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUmVmZXJlbmNlZENvbXBvbmVudCByZXNvbHZlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlDbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50IHZjID0gKENsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQpcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLSAgICAgICAgUmVmZXJlbmNlZENvbXBvbmVudCByYyA9IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRjb3JlRmFjdG9yeSgpLmNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsKLSAgICAgICAgcmMuc2V0QXJjaGl2ZU5hbWUocmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCkpOwotICAgICAgICByYy5zZXRSdW50aW1lUGF0aChyZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0gICAgICAgIHJjLnNldEhhbmRsZShVUkkuY3JlYXRlVVJJKFBST1RPQ09MICsgdmMuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyUGF0aCgpKSk7Ci0gICAgICAgIHJjLnNldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlLkNPTlNVTUVTX0xJVEVSQUwpOwotICAgICAgICByZXR1cm4gcmM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0NsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQ2xhc3NwYXRoQ29udGFpbmVyVmlydHVhbENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2I1Y2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvQ2xhc3NwYXRoQ29udGFpbmVyVmlydHVhbENvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLkFic3RyYWN0UmVzb3VyY2VMaXN0VmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoQ29udGFpbmVyVmlydHVhbENvbXBvbmVudCBleHRlbmRzCi0JCUFic3RyYWN0UmVzb3VyY2VMaXN0VmlydHVhbENvbXBvbmVudCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIID0gImNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT04gPSAiY29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9DT04gPSBDTEFTU1BBVEggKyBQYXRoLlNFUEFSQVRPUiArIENPTjsKLQlwcml2YXRlIFN0cmluZyBjb250YWluZXJQYXRoOwotCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVyRW50cmllczsKLQlwcml2YXRlIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCXByaXZhdGUgT2JqZWN0IGluaXRMb2NrID0gbmV3IE9iamVjdCgpOwotCXB1YmxpYyBDbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50KElQcm9qZWN0IHAsCi0JCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2luZ0NvbXBvbmVudCwgU3RyaW5nIGNvbnRhaW5lclBhdGgpIHsKLQkJc3VwZXIocCwgcmVmZXJlbmNpbmdDb21wb25lbnQpOwotCQl0aGlzLmNvbnRhaW5lclBhdGggPSBjb250YWluZXJQYXRoOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJc3luY2hyb25pemVkIChpbml0TG9jaykgewotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGxvY2FsQ29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKG5ldyBQYXRoKGNvbnRhaW5lclBhdGgpLCBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbG9jYWxjb250YWluZXJFbnRyaWVzID0gbnVsbDsKLQkJCWlmIChsb2NhbENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJbG9jYWxjb250YWluZXJFbnRyaWVzID0gbG9jYWxDb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2NhbGNvbnRhaW5lckVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W10ge307Ci0JCQl9Ci0JCQlzeW5jaHJvbml6ZWQgKGluaXRMb2NrKSB7Ci0JCQkJaWYoaW5pdGlhbGl6ZWQpewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNvbnRhaW5lciA9IGxvY2FsQ29udGFpbmVyOwotCQkJCWNvbnRhaW5lckVudHJpZXMgPSBsb2NhbGNvbnRhaW5lckVudHJpZXM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCS8vIGVhdCBpdAotCQl9IGZpbmFsbHkgewotCQkJc3luY2hyb25pemVkIChpbml0TG9jaykgewotCQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYodGhpcyA9PSBvKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZighc3VwZXIuZXF1YWxzKG8pKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50IG90aGVyID0gKENsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQpIG87Ci0JCXJldHVybiBjb250YWluZXJQYXRoID09IG51bGwgPyBvdGhlci5jb250YWluZXJQYXRoID09IG51bGwgOiBjb250YWluZXJQYXRoLmVxdWFscyhvdGhlci5jb250YWluZXJQYXRoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkgKyAoY29udGFpbmVyUGF0aCA9PSBudWxsID8gMCA6IGNvbnRhaW5lclBhdGguaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJQYXRoKCkgewotCQlyZXR1cm4gY29udGFpbmVyUGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIENMQVNTUEFUSF9DT04gKyBQYXRoLlNFUEFSQVRPUiArIGNvbnRhaW5lclBhdGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdElkU2VnbWVudCgpIHsKLQkJLy8gRG8gbm90IGNhbGwKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJQ2xhc3NwYXRoQ29udGFpbmVyIGdldENsYXNzcGF0aENvbnRhaW5lcigpewotCQlpbml0KCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gZ2V0RW50cmllcygpIHsKLQkJaW5pdCgpOwotCQlyZXR1cm4gY29udGFpbmVyRW50cmllczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhDb250YWluZXJQYXRoKCkgewotCQlyZXR1cm4gY29udGFpbmVyUGF0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVZpcnR1YWxGb2xkZXIgZ2V0Um9vdEZvbGRlcigpIHsKLQkJSVZpcnR1YWxGb2xkZXIgZm9sZGVyID0gbmV3IFZpcnR1YWxGb2xkZXIocHJvamVjdCwgbmV3IFBhdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyhpbnQgbWVtYmVyRmxhZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0RW50cmllcygpOwotCQkJCUFycmF5TGlzdDxJVmlydHVhbEZpbGU+IGphcnMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsRmlsZT4oKTsKLQkJCQlmb3IoSUNsYXNzcGF0aEVudHJ5IGVudHJ5OiBlbnRyaWVzKSB7Ci0JCQkJCWlmKCBlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQkJCUZpbGUgZiA9IGVudHJ5LmdldFBhdGgoKS50b0ZpbGUoKTsKLQkJCQkJCWphcnMuYWRkKG5ldyBBYnNvbHV0ZVZpcnR1YWxGaWxlKGdldFByb2plY3QoKSwgbmV3IFBhdGgoIi8iKSwgZikpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGphcnMudG9BcnJheShuZXcgSVZpcnR1YWxGaWxlW2phcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBBYnNvbHV0ZVZpcnR1YWxGaWxlIGV4dGVuZHMgVmlydHVhbEZpbGUgewotCQlwcml2YXRlIEZpbGUgZmlsZTsKLQkJcHVibGljIEFic29sdXRlVmlydHVhbEZpbGUoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsCi0JCQkJSVBhdGggYVJ1bnRpbWVQYXRoLCBGaWxlIGFic29sdXRlRmlsZSkgewotCQkJc3VwZXIoYUNvbXBvbmVudFByb2plY3QsIGFSdW50aW1lUGF0aCwgbnVsbCk7Ci0JCQl0aGlzLmZpbGUgPSBhYnNvbHV0ZUZpbGU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7IAotCQkJaWYoIEZpbGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJCXJldHVybiBmaWxlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb250YWluZXJbXSBnZXRVbmRlcmx5aW5nQ29udGFpbmVycygpIHsKLQkJLy8gZG8gbm90IGltcGxlbWVudCwgb3ZlcnJpZGluZyBrZXkgbWV0aG9kIG1lbWJlcnMoaW50KQotCQlyZXR1cm4gbmV3IElDb250YWluZXJbXXt9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUmVzb3VyY2VbXSBnZXRMb29zZVJlc291cmNlcygpIHsKLQkJLy8gZG8gbm90IGltcGxlbWVudCwgb3ZlcnJpZGluZyBrZXkgbWV0aG9kIG1lbWJlcnMoaW50KQotCQlyZXR1cm4gbmV3IElSZXNvdXJjZVtde307Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGIwNDRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50IGV4dGVuZHMgSVZpcnR1YWxDb21wb25lbnQgewotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3NGb2xkZXIoKTsKLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRDbGFzc0ZvbGRlcigpOwotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKTsKLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFuaWZlc3RDbGFzc3BhdGgoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9JQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZmNkNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9JQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBtZWFudCB0byBtYXJrIGEgdmlydHVhbCBjb21wb25lbnQgYXMKLSAqIGEgdHlwZSBvZiB2aXJ0dWFsIGNvbXBvbmVudCB3aGljaCBjYW4gcHJvdmlkZSAKLSAqIGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMgdG8gYmUgaW5jbHVkZWQgaW4gYSBwYXJlbnQgY29tcG9uZW50IAotICogCi0gKiBAYXV0aG9yIHJvYi5zdHJ5a2VyQHJlZGhhdC5jb20KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlciBleHRlbmRzIElWaXJ0dWFsQ29tcG9uZW50IHsKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHJlZmVyZW5jZXMgd2hpY2ggc2hvdWxkIGJlIGV4cG9ydGVkIGludG8gYSAKLQkgKiBwYXJlbnQgbW9kdWxlJ3MgYXBwcm9wcmlhdGUgZm9sZGVyIGZvciBjbGFzc3BhdGggZW50aXRpZXMuIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9JQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0lDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyNjcyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0lDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gbWFyayBhIHZpcnR1YWwgY29tcG9uZW50IGFzCi0gKiBhIHR5cGUgb2YgdmlydHVhbCBjb21wb25lbnQgd2hpY2ggY2FuIHJlY2VpdmUgYW5kIGhhbmRsZSAKLSAqIGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMgZnJvbSBjaGlsZCByZWZlcmVuY2VzIAotICogCi0gKiBAYXV0aG9yIHJvYi5zdHJ5a2VyQHJlZGhhdC5jb20KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aERlcGVuZGVuY3lSZWNlaXZlciBleHRlbmRzIElWaXJ0dWFsQ29tcG9uZW50IHsKLQkvKioKLQkgKiBSdW50aW1lIHBhdGggdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXNvbHZlZCBjb250cmlidXRpb25zIGZyb20gYSBjbGFzc3BhdGggZW50cnkgc2hvdWxkIGJlCi0JICogbWFwcGVkIGludG8gdGhlIGV4cG9ydGVkL2RlcGxveWVkIHN0cnVjdHVyZSBvZiB0aGUgcGFyZW50IG1vZHVsZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiB0aGF0IHRoZSB0YXJnZXQgbW9kdWxlCi0JICogaXMgbWFwcGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUiA9ICIuLi8iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogSVBhdGggdmFsdWUgb2YgUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEggPSBuZXcgUGF0aChSVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIpOwotCi0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdmlydHVhbCBjb21wb25lbnQgY2FuIGFjY2VwdAotCSAqIGNsYXNzcGF0aCByZWZlcmVuY2VzIGZyb20gY2hpbGRyZW4uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWNlaXZlQ2xhc3NwYXRoRGVwZW5kZW5jaWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmVmZXJyZWQgZm9sZGVyIHRvIHBsYWNlIGNoaWxkIGNsYXNzcGF0aAotCSAqIGRlcGVuZGVuY2llcywgb3IgbnVsbCBpZiB0aGV5IGNhbiBnbyB3aGVyZXZlciB0aGUgcmVmZXJlbmNlIGRpcmVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQYXRoIGdldENsYXNzcGF0aEZvbGRlclBhdGgoSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQgY29tcG9uZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvSVNpbmdsZVJvb3RTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvSVNpbmdsZVJvb3RTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViODdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0lTaW5nbGVSb290U3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNpbmdsZVJvb3RTdGF0dXMgZXh0ZW5kcyBJU3RhdHVzIHsKLQkKLQkvLyBJbmZvcm1hdGlvbiBbMC0zMl0gCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX1JPT1RfQ09OVEFJTkVSX0ZPVU5EID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfUk9PVF9GT1JDRUQgPSAyOwotCS8vRE8gTk9UIEFERCBBTlkgT1RIRVIgQ09OU1RBTlRTIFRPIFRIRSBJTkZPUk1BVElPTiBTRUNUSU9OCi0JCi0JLy8gV2FybmluZ3MgWzMzLTEyN10KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT1VSQ0VfUEFUSF9OT1RfRk9VTkQgPSAzMzsKLQkKLQkvLyBFcnJvcnMgWzEyOC01MTJdCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09NUE9ORU5UX0ZPVU5EID0gMTI5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUExJQ0lUTFlfRElTQUJMRUQgPSAxMzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1VNQUJMRV9SRUZFUkVOQ0VTX0ZPVU5EID0gMTMxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTktFRF9SRVNPVVJDRVNfRk9VTkQgPSAxMzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fUkVTT1VSQ0VfTUFQU19GT1VORCA9IDEzMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX09VVFBVVF9OT1RfQV9DT05URU5UX1JPT1QgPSAxMzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PVVRQVVRfR1JFQVRFUl9USEFOXzEgPSAxMzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOVElNRV9QQVRIX05PVF9ST09UID0gMTM2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVVJDRV9OT1RfSkFWQV9DT05UQUlORVIgPSAxMzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZX0NPTVBPTkVOVF9GT1VORCA9IDEzODsKLQotCS8vIGNhbGxiYWNrLWNvbnRyaWJ1dGVkIGVycm9yczogNTEyIGFuZCB1cAotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggd2l0aCB3aGljaCB0aGUgc3RhdHVzIGlzIGFzc29jaWF0ZWQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIHdpdGggd2hpY2ggdGhlIHN0YXR1cyBpcyBhc3NvY2lhdGVkLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCk7Ci0JCi0JLyoqIAotCSAqIFdpbGwgcmV0dXJuIHRoZSBJQ29udGFpbmVyIHRoYXQgaXMgdXNlZCBhcyB0aGUgInNpbmdsZS1yb290Ii4KLQkgKiBJZiBhICJzaW5nbGUtcm9vdCIgc3RydWN0dXJlIGlzIG5vdCBmb3VuZCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSAic2luZ2xlLXJvb3QiIGNvbnRhaW5lcgotCSAqLyAKLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRTaW5nbGVSb290KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0lnbm9yZUphdmFJblNvdXJjZUZvbGRlclBhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL0lnbm9yZUphdmFJblNvdXJjZUZvbGRlclBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOGVlNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9JZ25vcmVKYXZhSW5Tb3VyY2VGb2xkZXJQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5JSmF2YVByb2plY3RMaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLkphdmFDb3JlTGl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5KYXZhTGl0ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudC5GbGF0Q29tcG9uZW50VGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJZ25vcmVKYXZhSW5Tb3VyY2VGb2xkZXJQYXJ0aWNpcGFudCBleHRlbmRzIEFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50IHsKLQlJSmF2YVByb2plY3RMaXRlIGxpdGVQcm9qID0gbnVsbDsKLQlMaXN0PElQYXRoPiBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oKTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLQkJCUZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsLCBMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlpZiggaGFzSmF2YShjb21wb25lbnQpICkgewotCQkJbGl0ZVByb2ogPSBKYXZhQ29yZUxpdGUuY3JlYXRlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJaWYoIGxpdGVQcm9qICE9IG51bGwgJiYgSmF2YUxpdGVVdGlsaXRpZXMuZ2V0SmF2YU91dHB1dENvbnRhaW5lcnMobGl0ZVByb2opLnNpemUoKSA+IDApIHsKLQkJCQlMaXN0PElDb250YWluZXI+IHRlbXAgPSBKYXZhTGl0ZVV0aWxpdGllcy5nZXRKYXZhU291cmNlQ29udGFpbmVycyhsaXRlUHJvaik7Ci0JCQkJSXRlcmF0b3I8SUNvbnRhaW5lcj4gaSA9IHRlbXAuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJCQljb250YWluZXJzLmFkZChpLm5leHQoKS5nZXRGdWxsUGF0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRBZGRFeHBvcnRhYmxlRmlsZShJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LAotCQkJSVZpcnR1YWxDb21wb25lbnQgY3VycmVudENvbXBvbmVudCwKLQkJCUZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsLCBJRmxhdEZpbGUgZmlsZSkgewotCQlpZiggcm9vdENvbXBvbmVudCA9PSBjdXJyZW50Q29tcG9uZW50ICkgewotCQkJaWYoIGhhc0phdmEocm9vdENvbXBvbmVudCkgKSB7Ci0JCQkJLyogCi0JCQkJICogT25seSBpZ25vcmUgd2hlbiBnaXZlbiBhbiBlYXIsIHdhciwgZXRjLCBhbmQgbm90IAotCQkJCSAqIG9uZSBvZiBpdCdzIGNvbnN1bWVkIGNoaWxkcmVuLCB3aGljaCBtYXkgYmUgYSBmaWxlc2V0LCAKLQkJCQkgKiBvciBzb21lIG90aGVyIHVua25vd24gdHlwZSBvZiBjb250cmlidXRvcgotCQkJCSAqLwotCQkJCUlGaWxlIHQgPSAoSUZpbGUpZmlsZS5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQlpZiggdCAhPSBudWxsICkgewotCQkJCQlJdGVyYXRvcjxJUGF0aD4gaSA9IGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCQkJCWlmKCBpLm5leHQoKS5pc1ByZWZpeE9mKHQuZ2V0RnVsbFBhdGgoKSkgJiYgdC5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzSmF2YShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb21wb25lbnQuZ2V0UHJvamVjdCgpLmlzTmF0dXJlRW5hYmxlZCgib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvUmVwbGFjZU1hbmlmZXN0RXhwb3J0UGFydGljaXBhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvUmVwbGFjZU1hbmlmZXN0RXhwb3J0UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3ZjE5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL1JlcGxhY2VNYW5pZmVzdEV4cG9ydFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5NYW5pZmVzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LlZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudC5GbGF0Q29tcG9uZW50VGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgcmVwbGFjaW5nIG1hbmlmZXN0Lm1mIGZpbGVzCi0gKiB3aGljaCByZXF1aXJlIHVwZGF0aW5nIGJlZm9yZSBiZWluZyBleHBvcnRlZAotICogCi0gKiBAYXV0aG9yIHJvYgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VNYW5pZmVzdEV4cG9ydFBhcnRpY2lwYW50IGV4dGVuZHMgQWJzdHJhY3RGbGF0dGVuUGFydGljaXBhbnQgewotCS8vcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBNQU5JRkVTVF9QQVRIID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCXByaXZhdGUgSVBhdGggbWFuaWZlc3RQYXRoOwotCQotCXB1YmxpYyBSZXBsYWNlTWFuaWZlc3RFeHBvcnRQYXJ0aWNpcGFudChJUGF0aCBtYW5pZmVzdFBhdGgpIHsKLQkJdGhpcy5tYW5pZmVzdFBhdGggPSBtYW5pZmVzdFBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpbmFsaXplKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwKLQkJCUZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsLCBMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcykgewotCQlmb3JjZVVwZGF0ZShjb21wb25lbnQsIGRhdGFNb2RlbCwgcmVzb3VyY2VzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZm9yY2VVcGRhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LAotCQkJRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsIExpc3Q8SUZsYXRSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBqYXZhQ2xhc3NwYXRoVVJJcyA9IGdldENsYXNzcGF0aFVSSXMoY29tcG9uZW50KTsKLQkJaWYoICFqYXZhQ2xhc3NwYXRoVVJJcy5pc0VtcHR5KCkpIHsKLQkJCS8vIGZpbmQgdGhlIG9sZCBtYW5pZmVzdAotCQkJSUZsYXRGb2xkZXIgcGFyZW50ID0gKElGbGF0Rm9sZGVyKVZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eS5nZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKHJlc291cmNlcywgbWFuaWZlc3RQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7Ci0JCQlpZiggcGFyZW50ICE9IG51bGwgKSB7Ci0JCQkJSUZsYXRSZXNvdXJjZVtdIGNoaWxkcmVuID0gcGFyZW50Lm1lbWJlcnMoKTsKLQkJCQlJRmlsZSBvcmlnaW5hbCA9IG51bGw7Ci0JCQkJaW50IG9yaWdpbmFsSW5kZXggPSAwOwotCQkJCWZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYoIGNoaWxkcmVuW2ldLmdldE5hbWUoKS5lcXVhbHMobWFuaWZlc3RQYXRoLmxhc3RTZWdtZW50KCkpKSB7Ci0JCQkJCQlvcmlnaW5hbCA9IChJRmlsZSljaGlsZHJlbltpXS5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQkJCW9yaWdpbmFsSW5kZXggPSBpOwotCQkJCQkJRmlsZSBuZXdNYW5pZmVzdCA9IGdldE5ld01hbmlmZXN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCksIG9yaWdpbmFsLCBqYXZhQ2xhc3NwYXRoVVJJcyk7Ci0JCQkJCQlGbGF0RmlsZSBuZXdNYW5pZmVzdEV4cG9ydGFibGUgPSBuZXcgRmxhdEZpbGUobmV3TWFuaWZlc3QsIG5ld01hbmlmZXN0LmdldE5hbWUoKSwgbWFuaWZlc3RQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7Ci0JCQkJCQljaGlsZHJlbltvcmlnaW5hbEluZGV4XSA9IG5ld01hbmlmZXN0RXhwb3J0YWJsZTsKLQkJCQkJCXBhcmVudC5zZXRNZW1iZXJzKGNoaWxkcmVuKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGljaGV2ZXIgRmlsZSBpcyB0aGUgbmV3IG9uZSwgZXZlbiBpZiBpdCdzIHRoZSBzYW1lIGFzIHRoZSBvbGQgb25lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBGaWxlIGdldE5ld01hbmlmZXN0KElQcm9qZWN0IHByb2plY3QsIElGaWxlIG9yaWdpbmFsTWFuaWZlc3QsIExpc3Q8U3RyaW5nPiBqYXZhQ2xhc3NwYXRoVVJJcykgewotCQlmaW5hbCBJUGF0aCB3b3JraW5nTG9jYXRpb24gPSBwcm9qZWN0LmdldFdvcmtpbmdMb2NhdGlvbihDb21tb25GcmFtZXdvcmtzUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCS8vIGNyZWF0ZSBwYXRoIHRvIHRlbXAgTUFOSUZFU1QuTUYgCi0JCWZpbmFsIElQYXRoIHRlbXBNYW5pZmVzdFBhdGggPSB3b3JraW5nTG9jYXRpb24uYXBwZW5kKG1hbmlmZXN0UGF0aCk7Ci0JCWZpbmFsIEZpbGUgdGVtcEZpbGUgPSB0ZW1wTWFuaWZlc3RQYXRoLnRvRmlsZSgpOwotCQlpZiAoIXRlbXBGaWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBjcmVhdGUgcGFyZW50IGRpcnMgZm9yIHRlbXAgTUFOSUZFU1QuTUYKLQkJCWZpbmFsIEZpbGUgcGFyZW50ID0gdGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQlpZiAoIXBhcmVudC5ta2RpcnMoKSkgewotCQkJCQlyZXR1cm4gb3JpZ2luYWxNYW5pZmVzdCAhPSBudWxsID8gb3JpZ2luYWxNYW5pZmVzdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpIDogbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsJCi0JCQlNYW5pZmVzdFV0aWxpdGllcy51cGRhdGVNYW5pZmVzdENsYXNzcGF0aChvcmlnaW5hbE1hbmlmZXN0LCBqYXZhQ2xhc3NwYXRoVVJJcywgdGVtcEZpbGUpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHRlbXBGaWxlLmV4aXN0cygpID8gdGVtcEZpbGUgOiAgCi0JCQlvcmlnaW5hbE1hbmlmZXN0ICE9IG51bGwgPyBvcmlnaW5hbE1hbmlmZXN0LmdldExvY2F0aW9uKCkudG9GaWxlKCkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRDbGFzc3BhdGhVUklzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiB1cmlzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXVyaXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIHsKLQkJCWZpbmFsIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIgajJlZUNvbXAgPSAoSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlcikgY29tcG9uZW50OwotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gajJlZUNvbXAuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCWlmIChyZWZzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLnN0YXJ0c1dpdGgoSUNsYXNzcGF0aERlcGVuZGVuY3lSZWNlaXZlci5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIpKSB7Ci0JCQkJCQl1cmlzLmFkZChyZWZzW2ldLmdldFJ1bnRpbWVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5hcHBlbmQocmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpKS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJpczsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL1NpbmdsZVJvb3RFeHBvcnRQYXJ0aWNpcGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9TaW5nbGVSb290RXhwb3J0UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxMTk5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL1NpbmdsZVJvb3RFeHBvcnRQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgUmVkIEhhdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFJvYmVydG8gU2FuY2hleiBIZXJyZXJhIC0gWzM3MTkwN10gRG8gbm90IGFkZCBkdXBsaWNhdGUgcmVzb3VyY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuU2luZ2xlUm9vdFV0aWwuU2luZ2xlUm9vdENhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5DaGlsZE1vZHVsZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0Rm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudC5GbGF0Q29tcG9uZW50VGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklDaGlsZE1vZHVsZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdHRlblBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LlZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogU2luZ2xlIHJvb3Qgb3B0aW1pemF0aW9uLiAKLSAqIEBhdXRob3Igcm9iCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVSb290RXhwb3J0UGFydGljaXBhbnQgZXh0ZW5kcyBBYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudCB7Ci0JcHJpdmF0ZSBTaW5nbGVSb290UGFydGljaXBhbnRDYWxsYmFjayBjYWxsYmFja0hhbmRsZXI7Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50OwotCXByaXZhdGUgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWw7Ci0JcHJpdmF0ZSBJRmxhdHRlblBhcnRpY2lwYW50W10gZGVsZWdhdGVzOwotCXByaXZhdGUgTGlzdDxJQ2hpbGRNb2R1bGVSZWZlcmVuY2U+IGNoaWxkcmVuOwotCXByaXZhdGUJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzVG9BZGRBc1Jlc291cmNlcyA9IG51bGw7Ci0JCi0JcHVibGljIGludGVyZmFjZSBTaW5nbGVSb290UGFydGljaXBhbnRDYWxsYmFjayBleHRlbmRzIFNpbmdsZVJvb3RDYWxsYmFjayB7Ci0JCXB1YmxpYyBJRmxhdHRlblBhcnRpY2lwYW50W10gZ2V0RGVsZWdhdGVQYXJ0aWNpcGFudHMoKTsKLQl9Ci0JCi0JcHVibGljIFNpbmdsZVJvb3RFeHBvcnRQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQkJY2FsbGJhY2tIYW5kbGVyID0gbnVsbDsKLQl9Ci0JcHVibGljIFNpbmdsZVJvb3RFeHBvcnRQYXJ0aWNpcGFudChTaW5nbGVSb290UGFydGljaXBhbnRDYWxsYmFjayBoYW5kbGVyKSB7Ci0JCXRoaXMoKTsKLQkJY2FsbGJhY2tIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwgTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJdGhpcy5yb290Q29tcG9uZW50ID0gY29tcG9uZW50OwotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVsZWdhdGVzKCkgewotCQlpZiAoY2FsbGJhY2tIYW5kbGVyICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlcyA9IGNhbGxiYWNrSGFuZGxlci5nZXREZWxlZ2F0ZVBhcnRpY2lwYW50cygpOwotCQl9Ci0JCWVsc2UgewotCQkJZGVsZWdhdGVzID0gbmV3IElGbGF0dGVuUGFydGljaXBhbnRbXSB7fTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5PcHRpbWl6ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsCi0JCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZVJvb3RVdGlsKGNvbXBvbmVudCwgY2FsbGJhY2tIYW5kbGVyKS5pc1NpbmdsZVJvb3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBvcHRpbWl6ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIEZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsLCAKLQkJCUxpc3Q8SUZsYXRSZXNvdXJjZT4gcmVzb3VyY2VzLCBMaXN0PElDaGlsZE1vZHVsZVJlZmVyZW5jZT4gY2hpbGRNb2R1bGVzKSB7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZXMuY2xlYXIoKTsgLy8gV2Ugd2FudCBjb21wbGV0ZSBjb250cm9sCi0JCQljaGlsZE1vZHVsZXMuY2xlYXIoKTsKLQkJCWNoaWxkcmVuID0gY2hpbGRNb2R1bGVzOwotCQkJaW5pdGlhbGl6ZURlbGVnYXRlcygpOwotCQkJCi0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTaW5nbGVSb290VXRpbChjb21wb25lbnQsIGNhbGxiYWNrSGFuZGxlcikuZ2V0U2luZ2xlUm9vdCgpOwotCQkJSUZsYXRSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyhyZXNvdXJjZXMsIGNvbnRhaW5lciwgbmV3IFBhdGgoIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHNpemUgPSBtci5sZW5ndGg7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotCQkJCXJlc291cmNlcy5hZGQobXJbal0pOwotCQkJfQotCQkJYWRkQ2hpbGRNb2R1bGVzKGNvbXBvbmVudCk7Ci0JCQkvLyBhZGRDaGlsZE1vZHVsZXMgbWlnaHQgaGF2ZSBhZGRlZCBlbGVtZW50cyB0byByZWZlcmVuY2VzVG9BZGRBc1Jlc291cmNlcyB3aGlsZSBsb29raW5nIGZvciAKLQkJCS8vIGNoaWxkIG1vZHVsZXMuIExldCdzIGFkZCB0aGVzZSByZWZlcmVuY2VzCi0JCQlhZGRSZWZlcmVuY2VzQXNSZXNvdXJjZXMocmVzb3VyY2VzLCByZWZlcmVuY2VzVG9BZGRBc1Jlc291cmNlcyk7Ci0JCQkJCQkKLQkJCS8vIHJ1biBmaW5hbGl6ZXJzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWRlbGVnYXRlc1tpXS5maW5hbGl6ZShjb21wb25lbnQsIGRhdGFNb2RlbCwgcmVzb3VyY2VzKTsKLQkJCX0KLQkJfSBjYXRjaCggQ29yZUV4Y2VwdGlvbiBjZSApIHsKLQkJCS8vIFRPRE8gCi0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoaXMgZnVuY3Rpb24gYWRkcyByZXNvdXJjZXMgYmFzZWQgb24gdGhlIGxpc3Qgb2YgcmVmZXJlbmNlcy4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZmVyZW5jZXNBc1Jlc291cmNlcyhMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcywKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcykgewotCQkKLQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2U6cmVmZXJlbmNlcyl7Ci0JCQlGaWxlIGYgPSAoRmlsZSlyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7Ci0JCQlGbGF0RmlsZSBmaWxlID0gbmV3IEZsYXRGaWxlKGYsIHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpLCByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQlGbGF0UmVzb3VyY2UgZXhpc3RpbmdSZXMgPSBWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkuZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShyZXNvdXJjZXMsIGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKGZpbGUuZ2V0TmFtZSgpKSk7Ci0JCQkvLyBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdCBpbiB0aGUgbGlzdCBvZiByZXNvdXJjZXMsIGRvIG5vdCBhZGQgaXQKLQkJCWlmICggZXhpc3RpbmdSZXMgPT0gbnVsbCl7Ci0JCQkJLy8gVGhlIHJlc291cmNlIGlzIG5vdCBpbiB0aGUgbGlzdCBpZiByZXNvdXJjZXMsIHNvIGFkZCBpdC4KLQkJCQlJUGF0aCBwYXRoID0gcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCk7IC8vIEZvbGRlciB0byBhZGQgdGhlIHJlZiBpbgotCQkJCUlGbGF0Rm9sZGVyIGZvbGRlciA9IChJRmxhdEZvbGRlcikgVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5Ci0JCQkJCQkuZ2V0RXhpc3RpbmdNb2R1bGVSZXNvdXJjZShyZXNvdXJjZXMsIHBhdGgubWFrZVJlbGF0aXZlKCkpOwotCQkJCWlmKCBmb2xkZXIgPT0gbnVsbCApIHsKLQkJCQkJZm9sZGVyID0gVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmVuc3VyZVBhcmVudEV4aXN0cyhyZXNvdXJjZXMsIHBhdGgsIG51bGwpOwotCQkJCX0KLQkJCQlpZiggZm9sZGVyID09IG51bGwgKQotCQkJCQlyZXNvdXJjZXMuYWRkKGZpbGUpOwotCQkJCWVsc2UKLQkJCQkJVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihmb2xkZXIsIG5ldyBJRmxhdEZpbGVbXXtmaWxlfSk7CQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJRmxhdFJlc291cmNlW10gZ2V0TWVtYmVycyhMaXN0PElGbGF0UmVzb3VyY2U+IG1lbWJlcnMsIAotCQkJSUNvbnRhaW5lciBjb250LCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZVtdIHJlcyA9IGNvbnQubWVtYmVycygpOwotCQlpbnQgc2l6ZTIgPSByZXMubGVuZ3RoOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUyKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQlpZiAocmVzW2pdIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCUlDb250YWluZXIgY2MgPSAoSUNvbnRhaW5lcikgcmVzW2pdOwotCQkJCS8vIFJldHJpZXZlIGFscmVhZHkgZXhpc3RpbmcgbW9kdWxlIGZvbGRlciBpZiBhcHBsaWNhYmxlCi0JCQkJSUZsYXRGb2xkZXIgbWYgPSAoRmxhdEZvbGRlcikgVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycyxwYXRoLmFwcGVuZChuZXcgUGF0aChjYy5nZXROYW1lKCkpLm1ha2VSZWxhdGl2ZSgpKSk7Ci0JCQkJaWYgKG1mID09IG51bGwpIHsKLQkJCQkJbWYgPSBuZXcgRmxhdEZvbGRlcihjYywgY2MuZ2V0TmFtZSgpLCBwYXRoKTsKLQkJCQkJSUZsYXRGb2xkZXIgcGFyZW50ID0gKEZsYXRGb2xkZXIpIFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eS5nZXRFeGlzdGluZ01vZHVsZVJlc291cmNlKG1lbWJlcnMsIHBhdGgpOwotCQkJCQlpZiAocGF0aC5pc0VtcHR5KCkgfHwgcGF0aC5lcXVhbHMobmV3IFBhdGgoIi8iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1lbWJlcnMuYWRkKG1mKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQkJCQkJcGFyZW50ID0gVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmVuc3VyZVBhcmVudEV4aXN0cyhtZW1iZXJzLCBwYXRoLCBjYyk7Ci0JCQkJCQlWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkuYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKHBhcmVudCwgbmV3IElGbGF0UmVzb3VyY2VbXSB7bWZ9KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlJRmxhdFJlc291cmNlW10gbXIgPSBnZXRNZW1iZXJzKG1lbWJlcnMsIGNjLCBwYXRoLmFwcGVuZChjYy5nZXROYW1lKCkpKTsKLQkJCQlWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkuYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKG1mLCBtcik7Ci0JCQl9IGVsc2UgewotCQkJCUlGaWxlIGYgPSAoSUZpbGUpIHJlc1tqXTsKLQkJCQlJRmxhdEZpbGUgbWYgPSBWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkuY3JlYXRlTW9kdWxlRmlsZShmLCBwYXRoKTsKLQkJCQlpZiAoc2hvdWxkQWRkQ29tcG9uZW50RmlsZShyb290Q29tcG9uZW50LCBtZikpCi0JCQkJCWxpc3QuYWRkKG1mKTsKLQkJCX0KLQkJfQotCQlGbGF0UmVzb3VyY2VbXSBtciA9IG5ldyBGbGF0UmVzb3VyY2VbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobXIpOwotCQlyZXR1cm4gbXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkTW9kdWxlcyhJVmlydHVhbENvbXBvbmVudCB2YykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlZkFzUmVzb3VyY2UgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOwotCi0KLQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCW9wdGlvbnMucHV0KElWaXJ0dWFsQ29tcG9uZW50LlJFUVVFU1RFRF9SRUZFUkVOQ0VfVFlQRSwgSVZpcnR1YWxDb21wb25lbnQuRkxBVFRFTkFCTEVfUkVGRVJFTkNFUyk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gYWxsUmVmZXJlbmNlcyA9IHZjLmdldFJlZmVyZW5jZXMob3B0aW9ucyk7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotICAgIAkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gYWxsUmVmZXJlbmNlc1tpXTsKLQkJCWlmIChyZWZlcmVuY2UuZ2V0RGVwZW5kZW5jeVR5cGUoKSA9PSBEZXBlbmRlbmN5VHlwZS5VU0VTICkgewotCQkJCWlmIChzaG91bGRJZ25vcmVSZWZlcmVuY2UodmMsIHJlZmVyZW5jZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCQotCQkJCWlmIChpc0NoaWxkTW9kdWxlKHZjLCByZWZlcmVuY2UpKSB7Ci0JCQkJCUNoaWxkTW9kdWxlUmVmZXJlbmNlIGNtID0gbmV3IENoaWxkTW9kdWxlUmVmZXJlbmNlKHJlZmVyZW5jZSwgbmV3IFBhdGgoIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlMaXN0PElDaGlsZE1vZHVsZVJlZmVyZW5jZT4gZHVwbGljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJQ2hpbGRNb2R1bGVSZWZlcmVuY2UgdG1wIDogY2hpbGRyZW4pIHsKLQkJCQkJCWlmICh0bXAuZ2V0UmVsYXRpdmVVUkkoKS5lcXVhbHMoY20uZ2V0UmVsYXRpdmVVUkkoKSkpCi0JCQkJCQkJZHVwbGljYXRlcy5hZGQodG1wKTsKLQkJCQkJfQotCQkJCQljaGlsZHJlbi5yZW1vdmVBbGwoZHVwbGljYXRlcyk7Ci0JCQkJCWNoaWxkcmVuLmFkZChjbSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSXQncyBub3QgYSBjaGlsZCBtb2R1bGUsIGJ1dCBpdCBpcyBhIHJlZmVyZW5jZSB0aGF0IG5lZWRzIHRvIGJlIGFkZGVkIGluIGFueXdheQotCQkJCQlyZWZBc1Jlc291cmNlLmFkZChyZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KLSAgICAJfQotICAgIAlyZWZlcmVuY2VzVG9BZGRBc1Jlc291cmNlcyA9IHJlZkFzUmVzb3VyY2UudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVmQXNSZXNvdXJjZS5zaXplKCldKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGlsZE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZWxlZ2F0ZXNbaV0uaXNDaGlsZE1vZHVsZShjb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQsIGRhdGFNb2RlbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZElnbm9yZVJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZXMubGVuZ3RoOyBpKysgKSB7Ci0JCQlpZiAoZGVsZWdhdGVzW2ldLnNob3VsZElnbm9yZVJlZmVyZW5jZShjb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQsIGRhdGFNb2RlbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEFkZENvbXBvbmVudEZpbGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJRmxhdEZpbGUgZmlsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRlbGVnYXRlc1tpXS5pc0NoaWxkTW9kdWxlKGNvbXBvbmVudCwgZGF0YU1vZGVsLCBmaWxlKSkgewotCQkJCUNoaWxkTW9kdWxlUmVmZXJlbmNlIGNoaWxkID0gbmV3IENoaWxkTW9kdWxlUmVmZXJlbmNlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCksIGZpbGUpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7IAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoIWRlbGVnYXRlc1tpXS5zaG91bGRBZGRFeHBvcnRhYmxlRmlsZShjb21wb25lbnQsIGNvbXBvbmVudCwgZGF0YU1vZGVsLCBmaWxlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL1NpbmdsZVJvb3RTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvU2luZ2xlUm9vdFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzg1MzVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvU2luZ2xlUm9vdFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTaW5nbGVSb290U3RhdHVzIGV4dGVuZHMgU3RhdHVzIGltcGxlbWVudHMgSVNpbmdsZVJvb3RTdGF0dXMgewotCi0JSVBhdGggcGF0aDsKLQlJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCXB1YmxpYyBTaW5nbGVSb290U3RhdHVzKGludCB0eXBlLCBpbnQgY29kZSwgSVBhdGggcmVzb3VyY2VQYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lclBhdGgsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXN1cGVyKHR5cGUsIENvbW1vbkZyYW1ld29ya3NQbHVnaW4uUExVR0lOX0lELCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlwYXRoID0gcmVzb3VyY2VQYXRoOwotCQljb250YWluZXIgPSBjb250YWluZXJQYXRoOwotCX0KLQkKLQlwdWJsaWMgU2luZ2xlUm9vdFN0YXR1cyhpbnQgY29kZSwgSVBhdGggcmVzb3VyY2VQYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lclBhdGgpIHsKLQkJdGhpcyhnZXRTZXZlcml0eShjb2RlKSwgY29kZSwgcmVzb3VyY2VQYXRoLCBjb250YWluZXJQYXRoLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCXB1YmxpYyBJQ29udGFpbmVyIGdldFNpbmdsZVJvb3QoKSB7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldFNldmVyaXR5KGludCBjb2RlKSB7Ci0JCWlmKCBjb2RlIDwgMzMgKSByZXR1cm4gSVN0YXR1cy5JTkZPOwotCQlpZiggY29kZSA8IDEyOCApIHJldHVybiBJU3RhdHVzLldBUk5JTkc7Ci0JCXJldHVybiBJU3RhdHVzLkVSUk9SOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9TaW5nbGVSb290VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS9TaW5nbGVSb290VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVmNDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvU2luZ2xlUm9vdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLkphdmFMaXRlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBTaW5nbGVSb290VXRpbCB7Ci0JcHVibGljIGludGVyZmFjZSBTaW5nbGVSb290Q2FsbGJhY2sgewotCQlwdWJsaWMgYm9vbGVhbiBjYW5WYWxpZGF0ZShJVmlydHVhbENvbXBvbmVudCB2Yyk7Ci0JCXB1YmxpYyB2b2lkIHZhbGlkYXRlKFNpbmdsZVJvb3RVdGlsIHV0aWwsIElWaXJ0dWFsQ29tcG9uZW50IHZjLCBJUHJvamVjdCBwcm9qZWN0LCBMaXN0IHJlc291cmNlTWFwcyk7Ci0JfQotCQotCS8qKiAKLQkgKiBVc2VkIHRvIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3QgZXJyb3IgY29kZSBpcyBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0ZJUlNUX0VSUk9SID0gMHgwODsKLQkvKiogCi0JICogVXNlZCB0byBjYXB0dXJlIGFsbCBzdGF0dXMgY29kZXMgKGVycm9yLCB3YXJuaW5nLCBpbmZvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQUxMID0gMHgwNzsKLQkvKiogCi0JICogVXNlZCB0byBjYXB0dXJlIGFsbCBlcnJvciBhbmQgd2FybmluZyBzdGF0dXMgY29kZXMgb25seS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VSUk9SU19BTkRfV0FSTklOR1MgPSAweDA2OwotCS8qKiAKLQkgKiBVc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9yIHN0YXR1cyBjb2RlcyBvbmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfRVJST1JTID0gMHgwNDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR1MgPSAweDAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMHgwMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMID0gMHgwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfU0lOR0xFX1JPT1RfQ09OVEFJTkVSID0gMHgwOTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVNFX1NJTkdMRV9ST09UX1BST1BFUlRZID0gInVzZVNpbmdsZVJvb3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50OwotCXByaXZhdGUgU2luZ2xlUm9vdENhbGxiYWNrIGNhbGxiYWNrOwotCXByaXZhdGUgTGlzdDxJQ29udGFpbmVyPiBjYWNoZWRTb3VyY2VDb250YWluZXJzOwotCXByaXZhdGUgSUNvbnRhaW5lcltdIGNhY2hlZE91dHB1dENvbnRhaW5lcnM7Ci0JcHJpdmF0ZSBNdWx0aVN0YXR1cyB3cmFwcGVyU3RhdHVzOwotCXByaXZhdGUgaW50IFZBTElEQVRFX0ZMQUc7Ci0JCi0JcHVibGljIFNpbmdsZVJvb3RVdGlsKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQl0aGlzKGNvbXBvbmVudCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFNpbmdsZVJvb3RVdGlsKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgU2luZ2xlUm9vdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0JCXRoaXMuYUNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwotCX0KLQkKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZSBoYXMgYSBzaW1wbGUgc3RydWN0dXJlIGJhc2VkIG9uIGEKLQkgKiBzaW5nbGUtcm9vdCBmb2xkZXIsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICoKLQkgKiBJbiBhIHNpbmdsZS1yb290IHN0cnVjdHVyZSwgYWxsIGZpbGVzIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHJvb3QgZm9sZGVyCi0JICogYXJlIHBhcnQgb2YgdGhlIG1vZHVsZSwgYW5kIGFyZSBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IG1vZHVsZSBzdHJ1Y3R1cmUuIE5vCi0JICogbW9kdWxlIHJlc291cmNlcyBleGlzdCBvdXRzaWRlIG9mIHRoaXMgc2luZ2xlIGZvbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtb2R1bGUgaGFzIGEgc2luZ2xlLXJvb3Qgc3RydWN0dXJlLCBhbmQKLQkgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlUm9vdCgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlU2luZ2xlUm9vdChJTkNMVURFX0ZJUlNUX0VSUk9SKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7Ci0JfQotCQotCS8qKgotCSAqIFdpbGwgYXR0ZW1wdCB0byByZXR1cm4gdGhlIElDb250YWluZXIgdGhhdCBjb3VudHMgYXMgdGhlICJzaW5nbGUtcm9vdCIuCi0JICogSWYgdGhpcyBtb2R1bGUgZG9lcyBub3QgcXVhbGlmeSBhcyBhICJzaW5nbGUtcm9vdCIgbW9kdWxlLCB0aGlzCi0JICogbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBhbiBJQ29udGFpbmVyCi0JICogdGhhdCBtYXkgYmUgdXNlZCBhcyB0aGUgc2luZ2xlLXJvb3QgY29udGFpbmVyLiAKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250YWluZXIgcmVwcmVzZW50aW5nIHNpbmdsZS1yb290IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldFNpbmdsZVJvb3QoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVTaW5nbGVSb290KEdFVF9TSU5HTEVfUk9PVF9DT05UQUlORVIpOwotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5JTkZPKSB7Ci0JCQlJU3RhdHVzW10gY2hpbGRyZW4gPSAoKE11bHRpU3RhdHVzKSBzdGF0dXMpLmdldENoaWxkcmVuKCk7Ci0JCQlJU2luZ2xlUm9vdFN0YXR1cyByb290U3RhdHVzID0gKElTaW5nbGVSb290U3RhdHVzKSBjaGlsZHJlblswXTsKLQkJCXJldHVybiByb290U3RhdHVzLmdldFNpbmdsZVJvb3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBhIHNpbmdsZS1yb290IHN0cnVjdHVyZS4KLQkgKiAgQW4gSVN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgT0sgaXMgcmV0dXJuZWQgZm9yIGEgdmFsaWQgc2luZ2xlLXJvb3QgCi0JICogIHN0cnVjdHVyZS4gIEEgTXVsdGlTdGF0dXMgY29udGFpbmluZyBjaGlsZHJlbiBvZiB0eXBlIElTaW5nbGVSb290U3RhdHVzCi0JICogIGlzIHJldHVybmVkIGlmIGFueSBzdGF0dXMgY29kZXMgd2VyZSBjYXB0dXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24uCi0JICogIEEgTXVsdGlTdGF0dXMgd2l0aCBhIHNldmVyaXR5IG9mIElORk8gb3IgV0FSTklORyBpcyByZXR1cm5lZCBmb3IgYSB2YWxpZCAKLQkgKiAgc2luZ2xlLXJvb3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdHVzIGNvZGVzIHdpdGggbm8gc2V2ZXJpdGllcyBvZiBFUlJPUi4KLQkgKiAgQSBNdWx0aVN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgRVJST1IgbWVhbnMgdGhlIGNvbXBvbmVudCBkb2VzIG5vdCBoYXZlIGEKLQkgKiAgdmFsaWQgc2luZ2xlLXJvb3Qgc3RydWN0dXJlLgotCSAqICAKLQkgKiBAcGFyYW0gZmxhZyAtIGluZGljYXRlcyB0aGUgc3RhdHVzIGNvZGVzIChieSBzZXZlcml0eSkgdG8gY2FwdHVyZSBkdXJpbmcKLQkgKiAgICAgICAgICAgICAgIHRoZSB2YWxpZGF0aW9uLiAgVGhlIElOTENVREVfQUxMIGZsYWcgd2lsbCBhbHNvIGNhcHR1cmUgdGhlIAotCSAqICAgICAgICAgICAgICAgc2luZ2xlLXJvb3QgY29udGFpbmVyIGlmIGEgc2luZ2xlLXJvb3Qgc3RydWN0dXJlIHdhcyBmb3VuZC4KLQkgKiAgICAgICAgICAgICAgIFZhbGlkIGZsYWdzIGFyZTogCi0JICogICAgICAgICAgICAgICAJCQkJICBJTkNMVURFX0FMTAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFX0VSUk9SU19BTkRfV0FSTklOR1MKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERV9FUlJPUlMKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERV9GSVJTVF9FUlJPUgotCSAqICAgICAgICAgICAgICAgCi0JICogQHJldHVybiBJU3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTaW5nbGVSb290KGludCBmbGFnKSB7Ci0JCVZBTElEQVRFX0ZMQUcgPSBmbGFnOwotCQl3cmFwcGVyU3RhdHVzID0gbnVsbDsKLQkJU3RydWN0dXJlRWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlpZiAoZWRpdCA9PSBudWxsIHx8IGVkaXQuZ2V0Q29tcG9uZW50KCkgPT0gbnVsbCkgewotCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5OT19DT01QT05FTlRfRk9VTkQpOwotCQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJCX0JCi0JCQkKLQkJCWlmIChhQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuQklOQVJZX0NPTVBPTkVOVF9GT1VORCk7Ci0JCQkJcmV0dXJuIGdldFN0YXR1cygpOwotCQkJfQotCQkJCi0JCQkvLyAyMjk2NTAgLSBjaGVjayB0byBzZWUgaWYgdGhlIHByb3BlcnR5ICd1c2VTaW5nbGVSb290JyBpcyBkZWZpbmVkLiAKLQkJCUJvb2xlYW4gdXNlU2luZ2xlUm9vdCA9IGdldFVzZVNpbmdsZVJvb3RQcm9wZXJ0eShlZGl0KTsKLQkJCWlmICh1c2VTaW5nbGVSb290ICE9IG51bGwpIHsKLQkJCQkvL2NoZWNrIGlmIGl0IHdhcyBzZXQgdG8gZmFsc2UKLQkJCQlpZiAoIXVzZVNpbmdsZVJvb3QuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLkVYUExJQ0lUTFlfRElTQUJMRUQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLlNJTkdMRV9ST09UX0ZPUkNFRCwgYUNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldFN0YXR1cygpOwotCQkJfQotCQkJCi0JCQkvLyBpZiB0aGVyZSBhcmUgYW55IGNvbnN1bWVkIHJlZmVyZW5jZXMsIHRoaXMgaXMgbm90IHNpbmdsZS1yb290Ci0JCQlpZiAoaGFzQ29uc3VtYWJsZVJlZmVyZW5jZXMoYUNvbXBvbmVudCkpIHsKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuQ09OU1VNQUJMRV9SRUZFUkVOQ0VTX0ZPVU5EKTsKLQkJCQlpZiAoVkFMSURBVEVfRkxBRyA9PSBDQU5DRUwpCi0JCQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJLy8gaWYgdGhlcmUgYXJlIGFueSBsaW5rZWQgcmVzb3VyY2VzIHRoZW4gdGhpcyBpcyBub3QgYSBzaW5nbGUtcm9vdCBtb2R1bGUKLQkJCWlmIChyb290Rm9sZGVyc0hhdmVMaW5rZWRDb250ZW50KCkpIHsKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuTElOS0VEX1JFU09VUkNFU19GT1VORCk7Ci0JCQkJaWYgKFZBTElEQVRFX0ZMQUcgPT0gQ0FOQ0VMKSAKLQkJCQkJcmV0dXJuIGdldFN0YXR1cygpOwotCQkJfQotCQkJCi0JCQlMaXN0IHJlc291cmNlTWFwcyA9IGVkaXQuZ2V0Q29tcG9uZW50KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCQkKLQkJCS8vIElmIHRoZSBsaXN0IGlzIGVtcHR5LCByZXR1cm4gZmFsc2UKLQkJCWlmIChyZXNvdXJjZU1hcHMuc2l6ZSgpIDwgMSkgewotCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5OT19SRVNPVVJDRV9NQVBTX0ZPVU5EKTsKLQkJCQlyZXR1cm4gZ2V0U3RhdHVzKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChjYWxsYmFjayAhPSBudWxsICYmIGNhbGxiYWNrLmNhblZhbGlkYXRlKGFDb21wb25lbnQpKSB7IAotCQkJCWNhbGxiYWNrLnZhbGlkYXRlKHRoaXMsIGFDb21wb25lbnQsIGdldFByb2plY3QoKSwgcmVzb3VyY2VNYXBzKTsKLQkJCX0gCi0JCQlpZiAoVkFMSURBVEVfRkxBRyAhPSBDQU5DRUwpIHsKLQkJCQl2YWxpZGF0ZVByb2plY3QocmVzb3VyY2VNYXBzKTsKLQkJCX0KLQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNhY2hlZE91dHB1dENvbnRhaW5lcnMgPSBudWxsOwotCQkJY2FjaGVkU291cmNlQ29udGFpbmVycyA9IG51bGw7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGdldFVzZVNpbmdsZVJvb3RQcm9wZXJ0eShTdHJ1Y3R1cmVFZGl0IGVkaXQpIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcCA9IGVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JCWZpbmFsIExpc3QgY29tcG9uZW50UHJvcGVydGllcyA9IHdiQ29tcC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWlmIChjb21wb25lbnRQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCWZpbmFsIEl0ZXJhdG9yIGNvbXBvbmVudFByb3BlcnRpZXNJdGVyYXRvciA9IGNvbXBvbmVudFByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChjb21wb25lbnRQcm9wZXJ0aWVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvcGVydHkgd2JQcm9wZXJ0eSA9IChQcm9wZXJ0eSkgY29tcG9uZW50UHJvcGVydGllc0l0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoVVNFX1NJTkdMRV9ST09UX1BST1BFUlRZLmVxdWFscyh3YlByb3BlcnR5LmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih3YlByb3BlcnR5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ29uc3VtYWJsZVJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgdmMpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gdmMuZ2V0UmVmZXJlbmNlcygpOwotICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZkNvbXBvbmVudHNbaV07Ci0gICAgCQlpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCk9PUlWaXJ0dWFsUmVmZXJlbmNlLkRFUEVOREVOQ1lfVFlQRV9DT05TVU1FUykgewotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9qZWN0KExpc3QgcmVzb3VyY2VNYXBzKSB7Ci0JCS8vIEVuc3VyZSB0aGVyZSBhcmUgb25seSBzb3VyY2UgZm9sZGVyIGNvbXBvbmVudCByZXNvdXJjZSBtYXBwaW5ncyB0byB0aGUgcm9vdCBjb250ZW50IGZvbGRlcgotCQlpZiAoaXNSb290UmVzb3VyY2VNYXBwaW5nKHJlc291cmNlTWFwcykpIHsKLQkJCUlDb250YWluZXJbXSBqYXZhT3V0cHV0Rm9sZGVycyA9IGdldEphdmFPdXRwdXRGb2xkZXJzKCk7Ci0JCQkvLyBWZXJpZnkgb25seSBvbmUgamF2YSBvdXRwdXRmb2xkZXIKLQkJCWlmIChqYXZhT3V0cHV0Rm9sZGVycy5sZW5ndGggPT0gMSkgewotCQkJCS8vIEJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlIHdlIGtub3c6IGZvciBhbnkgZm9sZGVycyBkZWZpbmVkIGFzIHNvdXJjZSBpbiB0aGUgCi0JCQkJLy8gLmNvbXBvbmVudCBmaWxlIHRoYXQgdGhleSBhcmUgYWxzbyBqYXZhIHNvdXJjZSBmb2xkZXJzLgotCQkJCWlmICghaXNTb3VyY2VDb250YWluZXIoamF2YU91dHB1dEZvbGRlcnNbMF0pKSB7Ci0JCQkJCS8vIFRoZSBzaW5nbGUgb3V0cHV0IGZvbGRlciBpcyBOT1QgYSBzb3VyY2UgZm9sZGVyIHNvIHRoaXMgaXMgc2luZ2xlLXJvb3RlZC4gU2luY2UgdGhlCi0JCQkJCS8vIG91dHB1dCBmb2xkZXIgKHNvbWV0aGluZyBsaWtlIGNsYXNzZXMgb3IgYmluKSBpcyBub3QgYSBzb3VyY2UgZm9sZGVyLCBKRFQgY29waWVzIGFsbCBmaWxlcwotCQkJCQkvLyAoaW5jbHVkaW5nIG5vbiBKYXZhIGZpbGVzKSB0byB0aGlzIGZvbGRlciwgc28gZXZlcnkgcmVzb3VyY2UgbmVlZGVkIGF0IHJ1bnRpbWUgaXMgbG9jYXRlZCAKLQkJCQkJLy8gaW4gYSBzaW5nbGUgZGlyZWN0b3J5LgotCQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuU0lOR0xFX1JPT1RfQ09OVEFJTkVSX0ZPVU5ELCBqYXZhT3V0cHV0Rm9sZGVyc1swXSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IAotCQkJCS8vIFZlcmlmeSB0aGUgamF2YSBvdXRwdXQgZm9sZGVyIGlzIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgY29udGVudCByb290cwotCQkJCUlQYXRoIGphdmFPdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKVswXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJSUNvbnRhaW5lcltdIHJvb3RGb2xkZXJzID0gYUNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLQkJCQlmb3IgKGludCBpPTA7IGkgPCByb290Rm9sZGVycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUGF0aCBjb21wUm9vdFBhdGggPSByb290Rm9sZGVyc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJCWlmIChqYXZhT3V0cHV0UGF0aC5lcXVhbHMoY29tcFJvb3RQYXRoKSkgewotCQkJCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLlNJTkdMRV9ST09UX0NPTlRBSU5FUl9GT1VORCwgYUNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuSkFWQV9PVVRQVVRfTk9UX0FfQ09OVEVOVF9ST09UKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5KQVZBX09VVFBVVF9HUkVBVEVSX1RIQU5fMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldEphdmFPdXRwdXRGb2xkZXJzKCkgewotCQlpZiAoY2FjaGVkT3V0cHV0Q29udGFpbmVycyA9PSBudWxsKQotCQkJY2FjaGVkT3V0cHV0Q29udGFpbmVycyA9IGdldEphdmFPdXRwdXRGb2xkZXJzKGFDb21wb25lbnQpOwotCQlyZXR1cm4gY2FjaGVkT3V0cHV0Q29udGFpbmVyczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbnRhaW5lclswXTsKLQkJCi0JCUxpc3Q8SUNvbnRhaW5lcj4gbCA9IEphdmFMaXRlVXRpbGl0aWVzLmdldEphdmFPdXRwdXRDb250YWluZXJzKGNvbXBvbmVudCk7Ci0JCXJldHVybiBsLnRvQXJyYXkobmV3IElDb250YWluZXJbbC5zaXplKCldKTsKLQl9CQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcGF0aCBhcmd1bWVudCBpcyB0byBhIHNvdXJjZSBjb250YWluZXIgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhIHdvcmtzcGFjZSByZWxhdGl2ZSBmdWxsIHBhdGgKLQkgKiBAcmV0dXJuIGlzIHBhdGggYSBzb3VyY2UgY29udGFpbmVyPwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlQ29udGFpbmVyKElDb250YWluZXIgc291cmNlQ29udGFpbmVyKSB7Ci0JCWlmIChjYWNoZWRTb3VyY2VDb250YWluZXJzID09IG51bGwpIHsKLQkJCWNhY2hlZFNvdXJjZUNvbnRhaW5lcnMgPSBnZXRTb3VyY2VDb250YWluZXJzKGFDb21wb25lbnQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRTb3VyY2VDb250YWluZXJzLmNvbnRhaW5zKHNvdXJjZUNvbnRhaW5lcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxJQ29udGFpbmVyPiBnZXRTb3VyY2VDb250YWluZXJzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQlDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJcmV0dXJuIEphdmFMaXRlVXRpbGl0aWVzLmdldEphdmFTb3VyY2VDb250YWluZXJzKGNvbXBvbmVudCk7Ci0JfQkKLQkKLQkvKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm9vdCBmb2xkZXJzIG9mIHRoaXMgY29tcG9uZW50IGhhdmUgYW55IGxpbmtlZCByZXNvdXJjZXMgKGZvbGRlciBvciBmaWxlKTsKLSAgICAgKiBPdGhlcndpc2UgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvb3RGb2xkZXJzSGF2ZUxpbmtlZENvbnRlbnQoKSB7Ci0gICAgCWlmICh0aGlzLmFDb21wb25lbnQgIT0gbnVsbCkgewotICAgIAkJZmluYWwgSUNvbnRhaW5lcltdIHJvb3RGb2xkZXJzID0gdGhpcy5hQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVycygpOwotICAgIAkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290Rm9sZGVycy5sZW5ndGg7IGkrKykgewotICAgIAkJCXRyeSB7Ci0gICAgCQkJCWJvb2xlYW4gaGFzTGlua2VkQ29udGVudCA9IHRoaXMuaGFzTGlua2VkQ29udGVudChyb290Rm9sZGVyc1tpXSk7Ci0gICAgCQkJCWlmIChoYXNMaW5rZWRDb250ZW50KSB7Ci0gICAgCQkJCQlyZXR1cm4gdHJ1ZTsKLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlRXgpIHsKLSAgICAJCQkJQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2dFcnJvcihjb3JlRXgpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogSWYgdGhlIHJlc291cmNlIHRvIGNoZWNrIGlzIGEgZmlsZSB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgbGlua2VkLiBJZiB0aGUgcmVzb3VyY2UgdG8KLSAgICAgKiBjaGVjayBpcyBhIGZvbGRlciB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUgaWYgaXQsIGFueSBvZiBpdHMgc3ViIGRpcmVjdG9yaWVzLCBvciBhbnkgZmlsZSBjb250YWluZWQKLSAgICAgKiB3aXRoLWluIHRoaXMgZGlyZWN0b3J5IG9mIGFueSBvZiBpdCdzIHN1YiBkaXJlY3RvcmllcyBhcmUgbGlua2VkLiBPdGhlcndpc2UgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0xpbmtlZENvbnRlbnQoZmluYWwgSVJlc291cmNlIHJlc291cmNlVG9DaGVjaykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAlpZiAoKHJlc291cmNlVG9DaGVjayAhPSBudWxsKSAmJiByZXNvdXJjZVRvQ2hlY2suaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAJCS8vIHNraXAgbm9uLWFjY2Vzc2libGUgZmlsZXMKLSAgICAJCWlmIChyZXNvdXJjZVRvQ2hlY2suaXNMaW5rZWQoKSkgewotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAkJfQotICAgIAkJc3dpdGNoIChyZXNvdXJjZVRvQ2hlY2suZ2V0VHlwZSgpKSB7Ci0gICAgCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSOgotICAgIAkJCQkvLyByZWN1cnNpdmVseSBjaGVjayBzdWIgZGlyZWN0b3J5IGNvbnRlbnRzCi0gICAgCQkJCWZpbmFsIElSZXNvdXJjZVtdIHN1YkRpckNvbnRlbnRzID0gKChJRm9sZGVyKSByZXNvdXJjZVRvQ2hlY2spLm1lbWJlcnMoKTsKLSAgICAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJEaXJDb250ZW50cy5sZW5ndGg7IGkrKykgewotICAgIAkJCQkJaWYgKGhhc0xpbmtlZENvbnRlbnQoc3ViRGlyQ29udGVudHNbaV0pKSB7Ci0gICAgCQkJCQkJcmV0dXJuIHRydWU7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQkJYnJlYWs7Ci0gICAgCQkJY2FzZSBJUmVzb3VyY2UuRklMRToKLSAgICAJCQkJcmV0dXJuIHJlc291cmNlVG9DaGVjay5pc0xpbmtlZCgpOwotICAgIAkJCWRlZmF1bHQ6Ci0gICAgCQkJCS8vIHNraXAgYXMgd2Ugb25seSBjYXJlIGFib3V0IGZpbGVzIGFuZCBmb2xkZXJzCi0gICAgCQkJCWJyZWFrOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogRW5zdXJlIHRoYXQgYW55IGNvbXBvbmVudCByZXNvdXJjZSBtYXBwaW5ncyBhcmUgZm9yIHNvdXJjZSBmb2xkZXJzIGFuZCAKLQkgKiB0aGF0IHRoZXkgbWFwIHRvIHRoZSByb290IGNvbnRlbnQgZm9sZGVyCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlTWFwcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Jvb3RSZXNvdXJjZU1hcHBpbmcoTGlzdCByZXNvdXJjZU1hcHMpIHsKLQkJZm9yIChpbnQgaT0wOyBpIDwgcmVzb3VyY2VNYXBzLnNpemUoKTsgaSsrKSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZU1hcCA9IChDb21wb25lbnRSZXNvdXJjZSkgcmVzb3VyY2VNYXBzLmdldChpKTsKLQkJCS8vIFZlcmlmeSBpdCBtYXBzIHRvICIvIiBmb3IgdGhlIGNvbnRlbnQgcm9vdAotCQkJaWYgKCFpc1Jvb3RNYXBwaW5nKHJlc291cmNlTWFwKSkgewotCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5SVU5USU1FX1BBVEhfTk9UX1JPT1QsIHJlc291cmNlTWFwLmdldFJ1bnRpbWVQYXRoKCkpOwotCQkJCWlmIChWQUxJREFURV9GTEFHID09IENBTkNFTCkgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyB2ZXJpZnkgaXQgaXMgYWxzbyBhIHNyYyBjb250YWluZXIKLQkJCUlQYXRoIHNvdXJjZVBhdGggPSByZXNvdXJjZU1hcC5nZXRTb3VyY2VQYXRoKCk7Ci0JCQlJUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihzb3VyY2VQYXRoKTsKLQkJCWlmIChzb3VyY2VSZXNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHNvdXJjZVJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lciAmJiAhaXNTb3VyY2VDb250YWluZXIoKElDb250YWluZXIpIHNvdXJjZVJlc291cmNlKSkgewotCQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuU09VUkNFX05PVF9KQVZBX0NPTlRBSU5FUiwgc291cmNlUGF0aCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLlNPVVJDRV9QQVRIX05PVF9GT1VORCwgc291cmNlUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoVkFMSURBVEVfRkxBRyA9PSBDQU5DRUwpIHJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSb290TWFwcGluZyhDb21wb25lbnRSZXNvdXJjZSBtYXApIHsKLQkJLy8gVmVyaWZ5IGl0IG1hcHMgdG8gIi8iIGZvciB0aGUgY29udGVudCByb290Ci0JCWlmIChtYXAuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoUGF0aC5ST09UKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGFDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcG9ydFN0YXR1cyhpbnQgY29kZSkgewotCQlyZXBvcnRTdGF0dXMoY29kZSwgbnVsbCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydFN0YXR1cyhpbnQgY29kZSwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJcmVwb3J0U3RhdHVzKGNvZGUsIG51bGwsIGNvbnRhaW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydFN0YXR1cyhpbnQgY29kZSwgSVBhdGggcGF0aCkgewotCQlyZXBvcnRTdGF0dXMoY29kZSwgcGF0aCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydFN0YXR1cyhpbnQgY29kZSwgSVBhdGggcGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJSVNpbmdsZVJvb3RTdGF0dXMgc3RhdHVzID0gbmV3IFNpbmdsZVJvb3RTdGF0dXMoY29kZSwgcGF0aCwgY29udGFpbmVyKTsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCWlmICgoVkFMSURBVEVfRkxBRyAmIElOQ0xVREVfRklSU1RfRVJST1IpICE9IDApIHsKLQkJCQlWQUxJREFURV9GTEFHID0gQ0FOQ0VMOwotCQkJCWFkZFN0YXR1cyhzdGF0dXMpOwotCQkJfQotCQkJZWxzZSBpZiAoKFZBTElEQVRFX0ZMQUcgJiBJTkNMVURFX0VSUk9SUykgIT0gMCkgewotCQkJCWFkZFN0YXR1cyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyAmJiAoVkFMSURBVEVfRkxBRyAmIFdBUk5JTkdTKSAhPSAwKSB7Ci0JCQlhZGRTdGF0dXMoc3RhdHVzKTsKLQkJfQotCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8gJiYgKFZBTElEQVRFX0ZMQUcgJiBJTkZPKSAhPSAwKSB7IAotCQkJVkFMSURBVEVfRkxBRyA9IENBTkNFTDsKLQkJCWFkZFN0YXR1cyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRWYWxpZGF0ZUZsYWcoKSB7Ci0JCXJldHVybiBWQUxJREFURV9GTEFHOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlRmxhZyhpbnQgdmFsaWRhdGVGbGFnKSB7Ci0JCVZBTElEQVRFX0ZMQUcgPSB2YWxpZGF0ZUZsYWc7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlpZiAod3JhcHBlclN0YXR1cyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd3JhcHBlclN0YXR1czsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3RhdHVzKElTaW5nbGVSb290U3RhdHVzIHN0YXR1cykgewotCQlpZiAod3JhcHBlclN0YXR1cyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVyU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKENvbW1vbkZyYW1ld29ya3NQbHVnaW4uUExVR0lOX0lELCAwLCBuZXcgSVN0YXR1c1tdIHsgc3RhdHVzIH0sIG51bGwsIG51bGwpOwotCQl9IGVsc2UgewotCQkJd3JhcHBlclN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9BYnN0cmFjdEphdmFDb21wb25lbnREaXNjZXJuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9BYnN0cmFjdEphdmFDb21wb25lbnREaXNjZXJuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5M2UwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvQWJzdHJhY3RKYXZhQ29tcG9uZW50RGlzY2VybmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEphdmFDb21wb25lbnREaXNjZXJuZXIgaW1wbGVtZW50cyBJSmF2YUNvbXBvbmVudERpc2Nlcm5lciB7Ci0KLQlwdWJsaWMgSVByb2plY3RbXSBmaW5kUGFyZW50UHJvamVjdHMoSVByb2plY3QgY2hpbGQpIHsKLQkJcmV0dXJuIG5ldyBJUHJvamVjdFtde307Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZFBvc3NpYmxlTWFuaWZlc3RFbnRyaWVzKAotCQkJSVByb2plY3QgcGFyZW50UHJvamVjdCwgSVByb2plY3QgY2hpbGRQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbXXt9OwotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGZpbmRQb3NzaWJsZU1hbmlmZXN0RW50cmllcygKLQkJCUlQcm9qZWN0IHBhcmVudFByb2plY3QsIElQcm9qZWN0IGNoaWxkUHJvamVjdCwKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gY3VycmVudEVudHJpZXMpIHsKLQkJcmV0dXJuIG5ldyBJVmlydHVhbFJlZmVyZW5jZVtde307Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZEN1cnJlbnRNYW5pZmVzdEVudHJpZXMoCi0JCQlJUHJvamVjdCBwYXJlbnRQcm9qZWN0LCBJUHJvamVjdCBjaGlsZFByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBJVmlydHVhbFJlZmVyZW5jZVtde307Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0FyY2hpdmVNYW5pZmVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0FyY2hpdmVNYW5pZmVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjJkZDBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9BcmNoaXZlTWFuaWZlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIEFQSSBvZgotICogCi0gKiBAbGluayBqYXZhLnV0aWwuamFyLk1hbmlmZXN0LCBhbG9uZyB3aXRoIGFkZGVkIGhlbHBlcnMKLSAqLwotcHVibGljIGludGVyZmFjZSBBcmNoaXZlTWFuaWZlc3QgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuaWZlc3QgZW50cnkgKGF0dHJpYnV0ZXMpIGZvciB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpOwotCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSwgQXR0cmlidXRlcyBhdHRyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgbmFtZTsgaWYgdGhlIGVudHJ5IGRvZXMgbm90Ci0JICogZXhpc3QsIGNyZWF0ZXMgYSBuZXcgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBEZWZhdWx0cyB0aGUgdmVyc2lvbiB0byAiMS4wIiBpZiBub3QgYWxyZWFkeSBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWZXJzaW9uSWZOZWNlc3NhcnkoKTsKLQotCXB1YmxpYyB2b2lkIGFwcGVuZENsYXNzUGF0aChTdHJpbmcgZXh0ZW5zaW9uKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNjbGVhcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0QXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNnZXRFbnRyaWVzCi0JICovCi0JcHVibGljIE1hcCBnZXRFbnRyaWVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2dldEF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBnZXRNYWluQXR0cmlidXRlcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgaWZmIHRoZSBlbnRyeSBleGlzdHMgaW4gYSBjYXNlLXNlbnNpdGl2ZSBtYW5uZXI7IG1hbmlmZXN0IHZlcnNpb24gaXMKLQkgKiByZXF1aXJlZCBmb3IgdGhlIG1hbmlmZXN0IHRvIHNhdmUgY29ycmVjdGx5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdFZlcnNpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIGlmZiB0aGUgZW50cnkgZXhpc3RzIGluIGEgY2FzZS1zZW5zaXRpdmUgbWFubmVyOyBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIGlzCi0JICogb3B0aW9uYWwgaW4gIHRoZSBtYW5pZmVzdAotCSAqICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKTsKLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVudHJpZXMgbm90IGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBjbGFzcyBwYXRoIG9mIHRoaXMgbWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZXJnZUNsYXNzUGF0aChTdHJpbmdbXSBjbGFzc1BhdGhFbnRyaWVzKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNyZWFkCi0JICovCi0JcHVibGljIHZvaWQgcmVhZChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoU3RyaW5nIGVudHJ5TmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBPYmplY3Qga2V5KTsKLQotCXB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChTdHJpbmcgYVNwYWNlRGVsaW1pdGVkUGF0aCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbmF0aW9uVmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I3dyaXRlCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBNYW5pZmVzdCB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwgc3BsaXR0aW5nIGVhY2ggY2xhc3NwYXRoIGVudHJ5IG9uIGEgbGluZQotCSAqIGJ5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVTcGxpdHRpbmdDbGFzc3BhdGgoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0FyY2hpdmVNYW5pZmVzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9BcmNoaXZlTWFuaWZlc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NmI2ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0FyY2hpdmVNYW5pZmVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgbWFuaWZlc3QgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVNYW5pZmVzdEltcGwgZXh0ZW5kcyBqYXZhLnV0aWwuamFyLk1hbmlmZXN0IGltcGxlbWVudHMgQXJjaGl2ZU1hbmlmZXN0IHsKLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3RJbXBsKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJlYWQoaXMpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCUlPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJaW9lLmluaXRDYXVzZShlKTsKLQkJCXRocm93IGlvZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFyY2hpdmVNYW5pZmVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBtYW4KLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5qYXIuTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbChqYXZhLnV0aWwuamFyLk1hbmlmZXN0IG1hbikgewotCQlzdXBlcihtYW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuaWZlc3QgZW50cnkgKGF0dHJpYnV0ZXMpIGZvciB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJQXR0cmlidXRlcyBhdHRyID0gbmV3IEF0dHJpYnV0ZXMoKTsKLQkJYWRkRW50cnkoZW50cnlOYW1lLCBhdHRyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lLCBBdHRyaWJ1dGVzIGF0dHIpIHsKLQkJZ2V0RW50cmllcygpLnB1dChlbnRyeU5hbWUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZW50cnkgbmFtZTsgaWYgdGhlIGVudHJ5IGRvZXMgbm90Ci0JICogZXhpc3QsIGNyZWF0ZXMgYSBuZXcgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlBdHRyaWJ1dGVzIGF0dHIgPSBnZXRBdHRyaWJ1dGVzKGVudHJ5TmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlhZGRFbnRyeShlbnRyeU5hbWUpOwotCQlhdHRyID0gZ2V0QXR0cmlidXRlcyhlbnRyeU5hbWUpOwotCQlhdHRyLnB1dFZhbHVlKGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpIHsKLQkJLy9UaGlzIGlzIGEgaGFjayBiZWNhdXNlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIG1hbmlmZXN0IGRvZXMgbm90IHNlcmlhbGl6ZSBjb3JyZWN0bHkgaWYKLQkJLy9UaGUgdmVyc2lvbiBpcyBub3Qgc2V0LiBJbiBhZGRpdGlvbiB0byBzYXZlcywgdGhlIHNlcmlhbGl6YXRpb24gaXMgdXNlZCBmb3IgY29weQotCQlpZiAoZ2V0TWFuaWZlc3RWZXJzaW9uKCkgPT0gbnVsbCB8fCBnZXRNYW5pZmVzdFZlcnNpb24oKS5lcXVhbHMoIiIpKS8vJE5PTi1OTFMtMSQKLQkJCXNldE1hbmlmZXN0VmVyc2lvbigiMS4wIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRDbGFzc1BhdGgoamF2YS5sYW5nLlN0cmluZyBleHRlbnNpb24pIHsKLQkJU3RyaW5nIGNsYXNzUGF0aCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY2xhc3NQYXRoICE9IG51bGwpCi0JCQlzZXRDbGFzc1BhdGgoY2xhc3NQYXRoICsgIiAiICsgZXh0ZW5zaW9uKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXNldENsYXNzUGF0aChleHRlbnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDbGFzc1BhdGgoKSB7Ci0JCXJldHVybiBNYW5pZmVzdFV0aWxpdGllcy5nZXRWYWx1ZUlnbm9yZUtleUNhc2UoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgudG9TdHJpbmcoKSwgZ2V0TWFpbkF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCkgewotCQlTdHJpbmcgY2xhc3NQYXRoID0gZ2V0Q2xhc3NQYXRoKCk7Ci0JCWlmIChjbGFzc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlyZXR1cm4gTWFuaWZlc3RVdGlsaXRpZXMuZ2V0VG9rZW5zKGNsYXNzUGF0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBTdHJpbmcga2V5KSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZShrZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCkgewotCQlyZXR1cm4gTWFuaWZlc3RVdGlsaXRpZXMuZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTLnRvU3RyaW5nKCksIGdldE1haW5BdHRyaWJ1dGVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3RWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIG1lcmdlQ2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmdbXSBjbGFzc1BhdGhFbnRyaWVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJamF2YS51dGlsLkxpc3QgZXhpc3RpbmcgPSBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChnZXRDbGFzc1BhdGhUb2tlbml6ZWQoKSk7Ci0JCVN0cmluZyBjcCA9IGdldENsYXNzUGF0aCgpOwotCQlpZiAoY3AgIT0gbnVsbCkKLQkJCXNiLmFwcGVuZChjcCk7Ci0JCWJvb2xlYW4gZW1wdHkgPSBjcCA9PSBudWxsIHx8ICIiLmVxdWFscyhjcCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWV4aXN0aW5nLmNvbnRhaW5zKGNsYXNzUGF0aEVudHJpZXNbaV0pKSB7Ci0JCQkJaWYgKCFlbXB0eSkKLQkJCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCWVtcHR5ID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGNsYXNzUGF0aEVudHJpZXNbaV0pOwotCQkJfQotCQl9Ci0JCXNldENsYXNzUGF0aChzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWdldEVudHJpZXMoKS5yZW1vdmUoZW50cnlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeUF0dHJpYnV0ZShTdHJpbmcgZW50cnlOYW1lLCBPYmplY3Qga2V5KSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHIucmVtb3ZlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChqYXZhLmxhbmcuU3RyaW5nIGFTcGFjZURlbGltaXRlZFBhdGgpIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJaWYgKGFTcGFjZURlbGltaXRlZFBhdGggPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucmVtb3ZlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLQkJZWxzZQotCQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSC50b1N0cmluZygpLCBhU3BhY2VEZWxpbWl0ZWRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzKGphdmEubGFuZy5TdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucmVtb3ZlKEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTKTsKLQkJZWxzZQotCQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuTUFJTl9DTEFTUy50b1N0cmluZygpLCBjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYnV0ZXMucHV0VmFsdWUoQXR0cmlidXRlcy5OYW1lLk1BTklGRVNUX1ZFUlNJT04udG9TdHJpbmcoKSwgdmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBNYW5pZmVzdCB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbSwgc3BsaXR0aW5nIGVhY2ggY2xhc3NwYXRoIGVudHJ5IG9uIGEgbGluZQotCSAqIGJ5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVTcGxpdHRpbmdDbGFzc3BhdGgoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkvLyBXcml0ZSBvdXQgdGhlIG1haW4gYXR0cmlidXRlcyBmb3IgdGhlIG1hbmlmZXN0Ci0JCXdyaXRlTWFpblNwbGl0dGluZ0NsYXNzcGF0aChnZXRNYWluQXR0cmlidXRlcygpLCBkb3MpOwotCQkvLyBOb3cgd3JpdGUgb3V0IHRoZSBwcmUtZW50cnkgYXR0cmlidXRlcwotCQlJdGVyYXRvciBpdCA9IGdldEVudHJpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKChTdHJpbmcpIGUuZ2V0S2V5KCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCWRvcy53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCXdyaXRlKChBdHRyaWJ1dGVzKSBlLmdldFZhbHVlKCksIGRvcyk7Ci0JCX0KLQkJZG9zLmZsdXNoKCk7Ci0JfQotCi0JLyoKLQkgKiBXcml0ZXMgdGhlIGN1cnJlbnQgYXR0cmlidXRlcyB0byB0aGUgc3BlY2lmaWVkIGRhdGEgb3V0cHV0IHN0cmVhbS4gWFhYIE5lZWQgdG8gaGFuZGxlIFVURjgKLQkgKiB2YWx1ZXMgYW5kIGJyZWFrIHVwIGxpbmVzIGxvbmdlciB0aGFuIDcyIGJ5dGVzCi0JICogCi0JICogQHNlZSBBdHRyaWJ1dGVzI3dyaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBEYXRhT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCgoQXR0cmlidXRlcy5OYW1lKSBlLmdldEtleSgpKS50b1N0cmluZygpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodG9VdGY4KChTdHJpbmcpIGUuZ2V0VmFsdWUoKSkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCW9zLndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCW9zLndyaXRlQnl0ZXMoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogV3JpdGVzIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgdG8gdGhlIHNwZWNpZmllZCBkYXRhIG91dHB1dCBzdHJlYW0sIG1ha2Ugc3VyZSB0byB3cml0ZSBvdXQgdGhlCi0JICogTUFOSUZFU1RfVkVSU0lPTiBvciBTSUdOQVRVUkVfVkVSU0lPTiBhdHRyaWJ1dGVzIGZpcnN0LgotCSAqIAotCSAqIEBzZWUgQXR0cmlidXRlcyN3cml0ZU1haW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU1haW5TcGxpdHRpbmdDbGFzc3BhdGgoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBEYXRhT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSAqLVZlcnNpb24gaGVhZGVyIGZpcnN0LCBpZiBpdCBleGlzdHMKLQkJU3RyaW5nIHZlcm5hbWUgPSBBdHRyaWJ1dGVzLk5hbWUuTUFOSUZFU1RfVkVSU0lPTi50b1N0cmluZygpOwotCQlTdHJpbmcgdmVyc2lvbiA9IHRvVXRmOChhdHRyaWJ1dGVzLmdldFZhbHVlKHZlcm5hbWUpKTsKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJdmVybmFtZSA9IEF0dHJpYnV0ZXMuTmFtZS5TSUdOQVRVUkVfVkVSU0lPTi50b1N0cmluZygpOwotCQkJdmVyc2lvbiA9IHRvVXRmOChhdHRyaWJ1dGVzLmdldFZhbHVlKHZlcm5hbWUpKTsKLQkJfQotCi0JCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCW91dC53cml0ZUJ5dGVzKHZlcm5hbWUgKyAiOiAiICsgdmVyc2lvbiArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gd3JpdGUgb3V0IGFsbCBhdHRyaWJ1dGVzIGV4Y2VwdCBmb3IgdGhlIHZlcnNpb24KLQkJLy8gd2Ugd3JvdGUgb3V0IGVhcmxpZXIKLQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoQXR0cmlidXRlcy5OYW1lKSBlLmdldEtleSgpKS50b1N0cmluZygpOwotCQkJaWYgKCh2ZXJzaW9uICE9IG51bGwpICYmICEobmFtZS5lcXVhbHNJZ25vcmVDYXNlKHZlcm5hbWUpKSkgewotCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgudG9TdHJpbmcoKSkpIHsKLQkJCQkJd3JpdGVTcGxpdChvdXQsIG5hbWUsIHRvVXRmOCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKHRvVXRmOCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCQlvdXQud3JpdGVCeXRlcyhidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJb3V0LndyaXRlQnl0ZXMoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlU3BsaXQoRGF0YU91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsKLQkJaW50IGluYyA9IDA7Ci0JCXdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJCWlmIChpbmMgPT0gMCkgewotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCh0b2submV4dFRva2VuKCkpOwotCQkJaWYgKHRvay5jb3VudFRva2VucygpID4gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIgXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NhbE1ha2U3MlNhZmUoYnVmZmVyKTsKLQkJCW91dC53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCWluYysrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaW5lIGJyZWFrcyB0byBlbmZvcmNlIGEgbWF4aW11bSA3MiBieXRlcyBwZXIgbGluZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9jYWxNYWtlNzJTYWZlKFN0cmluZ0J1ZmZlciBsaW5lKSB7Ci0JCWludCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID4gNzIpIHsKLQkJCWludCBpbmRleCA9IDcwOwotCQkJLy8gYnVnIDIzMzgwMSAtIHdlIGFyZSBzcGxpdHRpbmcgZXZlcnkgNzIgYnl0ZXMsIGJ1dCBhZGRpbmcgdHdvIGJ5dGVzIHRvIHRoZSBlbmQgb2YsIAotCQkJLy8gYW5kIG9uZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGxpbmUgYWZ0ZXIgdGhlIGZpcnN0Ci0JCQl3aGlsZSAoaW5kZXggLSAxIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGxpbmUuY2hhckF0KGluZGV4KSA9PSAnICcpCi0JCQkJewotCQkJCQlpbmRleC0tOwotCQkJCX0KLQkJCQlsaW5lLmluc2VydChpbmRleCwgIlxyXG4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmRleCArPSA3MjsKLQkJCQlsZW5ndGggKz0gMzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbmF0aW9uVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBnZXRNYWluQXR0cmlidXRlcygpOwotCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OLnRvU3RyaW5nKCksIHZlcnNpb24pOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIGEgZG91YmxlLWJ5dGUgc3RyaW5nIGludG8gVVRGOCBmb3JtLiBFdmVyeSBjaGFyYWN0ZXIgaW4gdGhlCi0gICAgICogcmV0dXJuZWQgc3RyaW5nIHJlcHJlc2VudHMgb25lIGJ5dGUgb2YgdGhlIFVURjggZW5jb2RpbmcuIAotICAgICAqLwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHRvVXRmOCggZmluYWwgU3RyaW5nIHN0ciApIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoIHN0ciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgYnl0ZVtdIHV0ZjggPSBzdHIuZ2V0Qnl0ZXMoICJVVEYtOCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyggdXRmOCwgMCwgMCwgdXRmOC5sZW5ndGggKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9JSmF2YUNvbXBvbmVudERpc2Nlcm5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0lKYXZhQ29tcG9uZW50RGlzY2VybmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjZjMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0lKYXZhQ29tcG9uZW50RGlzY2VybmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBpcyBpbnRlcm5hbC4gUGxlYXNlIGRvbid0IHVzZSBpdCB1bmxlc3MgeW91J3JlIHByZXBhcmVkIAotICogZm9yIGl0IHRvIGNoYW5nZSBkcmFzdGljYWxseSBhdCBhbnkgcmFuZG9tIHRpbWUuIAotICogCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgdXRpbGl0eSB0byBoZWxwIGRpc2NvdmVyIHRoZSBoZWlyYXJjaHkgCi0gKiBvZiBqYXZhLXJlbGF0ZWQgY29tcG9uZW50cywgYW5kIGFzc2lzdCBpbiBtYW5pZmVzdCBtYW5hZ2VtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhQ29tcG9uZW50RGlzY2VybmVyIHsKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHBhcmVudCBwcm9qZWN0cywgcHJvamVjdHMgd2hpY2ggYWxyZWFkeSAqZG8qIGhhdmUgIAotCSAqIGEgcHJvamVjdCByZWZlcmVuY2UgdG8gdGhpcyBjaGlsZCBwcm9qZWN0Ci0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUHJvamVjdFtdIGZpbmRQYXJlbnRQcm9qZWN0cyhJUHJvamVjdCBjaGlsZCk7Ci0JCi0JLyoqCi0JICogQWxsIHJldHVybmVkIG1hbmlmZXN0IGVudHJpZXMgc2hvdWxkIGhhdmUgYSBydW50aW1lIHBhdGggYW5kIGFyY2hpdmVOYW1lIAotCSAqIHdoaWNoLCB3aGVuIGNvbWJpbmVkLCB3aWxsIGJlIHN1aXRhYmxlIGZvciBleHBvcnQgdG8gYSBjaGlsZCdzIAotCSAqIG1hbmlmZXN0IGZpbGUuIElmIGEgcmVmZXJlbmNlIGlzIGluIGEgZm9sZGVyIHRoYXQgZG9lcyBub3QKLQkgKiByZXF1aXJlIGl0IHRvIGJlIHByZXNlbnQgaW4gdGhlIG1hbmlmZXN0Lm1mIGNsYXNzcGF0aCwgaXQgCi0JICogc2hvdWxkICpOT1QqIGJlIHJldHVybmVkIGhlcmUuIAotCSAqIAotCSAqIEFsbCByZWZlcmVuY2VzIHNob3VsZCBoYXZlIGEgZ2V0UnVudGltZVBhdGgoKSArIGdldEFyY2hpdmVOYW1lKCkgdGhhdAotCSAqIHJlc29sdmVzIHRvIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBpbiB0aGUgbWFuaWZlc3QubWYgY2xhc3NwYXRoIHNlY3Rpb24uIAotCSAqIAotCSAqIEFueSByZWZlcmVuY2UgKmFscmVhZHkqIGluIHRoZSBtYW5pZmVzdCBzaG91bGQgKm5vdCogYmUgcmV0dXJuZWQgaGVyZQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRQcm9qZWN0Ci0JICogQHBhcmFtIGNoaWxkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBmaW5kUG9zc2libGVNYW5pZmVzdEVudHJpZXMoSVByb2plY3QgcGFyZW50UHJvamVjdCwgSVByb2plY3QgY2hpbGRQcm9qZWN0KTsKLQkKLQkvKioKLQkgKiBBbGwgcmV0dXJuZWQgbWFuaWZlc3QgZW50cmllcyBzaG91bGQgaGF2ZSBhIHJ1bnRpbWUgcGF0aCBhbmQgYXJjaGl2ZU5hbWUgCi0JICogd2hpY2gsIHdoZW4gY29tYmluZWQsIHdpbGwgYmUgc3VpdGFibGUgZm9yIGV4cG9ydCB0byBhIGNoaWxkJ3MgCi0JICogbWFuaWZlc3QgZmlsZS4gSWYgYSByZWZlcmVuY2UgaXMgaW4gYSBmb2xkZXIgdGhhdCBkb2VzIG5vdAotCSAqIHJlcXVpcmUgaXQgdG8gYmUgcHJlc2VudCBpbiB0aGUgbWFuaWZlc3QubWYgY2xhc3NwYXRoLCBpdCAKLQkgKiBzaG91bGQgKk5PVCogYmUgcmV0dXJuZWQgaGVyZS4gCi0JICogCi0JICogQWxsIHJlZmVyZW5jZXMgc2hvdWxkIGhhdmUgYSBnZXRSdW50aW1lUGF0aCgpICsgZ2V0QXJjaGl2ZU5hbWUoKSB0aGF0Ci0JICogcmVzb2x2ZXMgdG8gdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGluIHRoZSBtYW5pZmVzdC5tZiBjbGFzc3BhdGggc2VjdGlvbi4gCi0JICogCi0JICogQW55IHJlZmVyZW5jZSBlcXVpdmlsYW50IHRvIHRoZSBvbmVzIGluIGN1cnJlbnRFbnRyaWVzIHNob3VsZCBub3QgYmUgcmV0dXJuZWQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50UHJvamVjdAotCSAqIEBwYXJhbSBjaGlsZFByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZFBvc3NpYmxlTWFuaWZlc3RFbnRyaWVzKElQcm9qZWN0IHBhcmVudFByb2plY3QsIElQcm9qZWN0IGNoaWxkUHJvamVjdCwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjdXJyZW50RW50cmllcyk7Ci0JCi0JCi0JLyoqCi0JICogQWxsIHJldHVybmVkIG1hbmlmZXN0IGVudHJpZXMgc2hvdWxkIGhhdmUgYSBydW50aW1lIHBhdGggYW5kIGFyY2hpdmVOYW1lIAotCSAqIHdoaWNoLCB3aGVuIGNvbWJpbmVkLCB3aWxsIGJlIHN1aXRhYmxlIGZvciBleHBvcnQgdG8gYSBjaGlsZCdzIAotCSAqIG1hbmlmZXN0IGZpbGUuIElmIGEgcmVmZXJlbmNlIGlzIGluIGEgZm9sZGVyIHRoYXQgZG9lcyBub3QKLQkgKiByZXF1aXJlIGl0IHRvIGJlIHByZXNlbnQgaW4gdGhlIG1hbmlmZXN0Lm1mIGNsYXNzcGF0aCwgaXQgCi0JICogc2hvdWxkICpOT1QqIGJlIHJldHVybmVkIGhlcmUuIAotCSAqIAotCSAqIEFsbCByZWZlcmVuY2VzIHNob3VsZCBoYXZlIGEgZ2V0UnVudGltZVBhdGgoKSArIGdldEFyY2hpdmVOYW1lKCkgdGhhdAotCSAqIHJlc29sdmVzIHRvIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBpbiB0aGUgbWFuaWZlc3QubWYgY2xhc3NwYXRoIHNlY3Rpb24uIAotCSAqIAotCSAqIEFueSByZWZlcmVuY2UgKm5vdCogaW4gdGhlIG1hbmlmZXN0IHNob3VsZCAqbm90KiBiZSByZXR1cm5lZCBoZXJlCi0JICogCi0JICogQHBhcmFtIHBhcmVudFByb2plY3QKLQkgKiBAcGFyYW0gY2hpbGRQcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGZpbmRDdXJyZW50TWFuaWZlc3RFbnRyaWVzKElQcm9qZWN0IHBhcmVudFByb2plY3QsIElQcm9qZWN0IGNoaWxkUHJvamVjdCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0phdmFNb2R1bGVDb21wb25lbnRVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvSmF2YU1vZHVsZUNvbXBvbmVudFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkOTU2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvSmF2YU1vZHVsZUNvbXBvbmVudFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEEgVXRpbGl0eSBjbGFzcyB0byBoZWxwIGZpbmQgY3VycmVudCBhbmQgcG9zc2libGUgbWFuaWZlc3QgZW50cmllcwotICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZHVsZUNvbXBvbmVudFV0aWxpdHkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUphdmFDb21wb25lbnREaXNjZXJuZXJbXSBkaXNjZXJuZXJzOwotCXByb3RlY3RlZCBzdGF0aWMgSUphdmFDb21wb25lbnREaXNjZXJuZXJbXSBnZXREaXNjZXJuZXJzKCkgewotCQlpZiggZGlzY2VybmVycyA9PSBudWxsICkgewotCQkJZGlzY2VybmVycyA9IGxvYWREaXNjZXJuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc2Nlcm5lcnMgPT0gbnVsbCA/IG5ldyBJSmF2YUNvbXBvbmVudERpc2Nlcm5lcltde30gOiBkaXNjZXJuZXJzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJSmF2YUNvbXBvbmVudERpc2Nlcm5lcltdIGxvYWREaXNjZXJuZXJzKCkgewotCQlBcnJheUxpc3Q8SUphdmFDb21wb25lbnREaXNjZXJuZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElKYXZhQ29tcG9uZW50RGlzY2VybmVyPigpOwotICAgICAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgCQlDb21tb25GcmFtZXdvcmtzUGx1Z2luLlBMVUdJTl9JRCwgIkphdmFDb21wb25lbnREaXNjZXJuZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNmLmxlbmd0aDsgaSsrICkgewotICAgICAgICAJdHJ5IHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZCgoSUphdmFDb21wb25lbnREaXNjZXJuZXIpY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgICAgIAkJLy8gVE9ETyBsb2cKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJSmF2YUNvbXBvbmVudERpc2Nlcm5lcltsaXN0LnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZmluZFBhcmVudFByb2plY3RzKElQcm9qZWN0IGNoaWxkKSB7Ci0JCUlKYXZhQ29tcG9uZW50RGlzY2VybmVyW10gZXh0ZW5zaW9ucyA9IGdldERpc2Nlcm5lcnMoKTsKLQkJQXJyYXlMaXN0PElQcm9qZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrICkgewotCQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChleHRlbnNpb25zW2ldLmZpbmRQYXJlbnRQcm9qZWN0cyhjaGlsZCkpKTsKLQkJfQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJUHJvamVjdFtsaXN0LnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZFBvc3NpYmxlTWFuaWZlc3RFbnRyaWVzKElQcm9qZWN0IHBhcmVudFByb2plY3QsIElQcm9qZWN0IGNoaWxkUHJvamVjdCkgewotCQlJSmF2YUNvbXBvbmVudERpc2Nlcm5lcltdIGV4dGVuc2lvbnMgPSBnZXREaXNjZXJuZXJzKCk7Ci0JCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyApIHsKLQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9uc1tpXS5maW5kUG9zc2libGVNYW5pZmVzdEVudHJpZXMocGFyZW50UHJvamVjdCwgY2hpbGRQcm9qZWN0KSkpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGZpbmRQb3NzaWJsZU1hbmlmZXN0RW50cmllcyhJUHJvamVjdCBwYXJlbnRQcm9qZWN0LCBJUHJvamVjdCBjaGlsZFByb2plY3QsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3VycmVudCkgewotCQlJSmF2YUNvbXBvbmVudERpc2Nlcm5lcltdIGV4dGVuc2lvbnMgPSBnZXREaXNjZXJuZXJzKCk7Ci0JCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyApIHsKLQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9uc1tpXS5maW5kUG9zc2libGVNYW5pZmVzdEVudHJpZXMocGFyZW50UHJvamVjdCwgY2hpbGRQcm9qZWN0LCBjdXJyZW50KSkpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGZpbmRDdXJyZW50TWFuaWZlc3RFbnRyaWVzKElQcm9qZWN0IHBhcmVudFByb2plY3QsIElQcm9qZWN0IGNoaWxkUHJvamVjdCkgewotCQlJSmF2YUNvbXBvbmVudERpc2Nlcm5lcltdIGV4dGVuc2lvbnMgPSBnZXREaXNjZXJuZXJzKCk7Ci0JCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7Ci0JCWZvciggaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKyApIHsKLQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9uc1tpXS5maW5kQ3VycmVudE1hbmlmZXN0RW50cmllcyhwYXJlbnRQcm9qZWN0LCBjaGlsZFByb2plY3QpKSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbbGlzdC5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvTWFuaWZlc3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9NYW5pZmVzdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzk4NTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9NYW5pZmVzdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAgSUJNIENvcnBvcmF0aW9uLCBSZWQgSGF0LCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RVdGlsaXRpZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0hFQURFUiA9ICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcclxuQ2xhc3MtUGF0aDogXHJcblxyXG4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZU1hbmlmZXN0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlvdXQud3JpdGUoTUFOSUZFU1RfSEVBREVSLmdldEJ5dGVzKCkpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJdGhyb3cgaW9lOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBnZXRUb2tlbnMoYVN0cmluZywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUb2tlbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IChkZWxpbWl0ZXIgPT0gbnVsbCkgPyBuZXcgU3RyaW5nVG9rZW5pemVyKGFTdHJpbmcpIDogbmV3IFN0cmluZ1Rva2VuaXplcihhU3RyaW5nLCBkZWxpbWl0ZXIpOwotCQlpbnQgc2l6ZSA9IHRvay5jb3VudFRva2VucygpOwotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgJiYgdG9rLmhhc01vcmVUb2tlbnMoKTsgaSsrKSB7Ci0JCQl0b2tlbnNbaV0gPSB0b2submV4dFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZUlnbm9yZUtleUNhc2UgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlSWdub3JlS2V5Q2FzZShqYXZhLmxhbmcuU3RyaW5nIGtleSwgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzIGF0dHIpIHsKLQkJSXRlcmF0b3Iga2V5c0FuZFZhbHVlcyA9IGF0dHIuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5c0FuZFZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGtleXNBbmRWYWx1ZXMubmV4dCgpOwotCQkJU3RyaW5nIGVudHJ5S2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKLQkJCWlmIChlbnRyeUtleS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCA/IG51bGwgOiBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlTWFuaWZlc3QgZ2V0TWFuaWZlc3QoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJUGF0aCBtYW5pZmVzdFBhdGgpIHsKLQkJaWYoICFjb21wb25lbnQuaXNCaW5hcnkoKSApCi0JCQlyZXR1cm4gZ2V0Tm9uQmluYXJ5Q29tcG9uZW50TWFuaWZlc3QoY29tcG9uZW50LCBtYW5pZmVzdFBhdGgpOwotCQlyZXR1cm4gZ2V0QmluYXJ5Q29tcG9uZW50TWFuaWZlc3QoY29tcG9uZW50LCBtYW5pZmVzdFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFyY2hpdmVNYW5pZmVzdCBnZXRCaW5hcnlDb21wb25lbnRNYW5pZmVzdChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElQYXRoIG1hbmlmZXN0UGF0aCkgewotCQlqYXZhLmlvLkZpbGUgZmlsZSA9IChGaWxlKWNvbXBvbmVudC5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQlpZiggZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IHJlYWRCaW5hcnlNYW5pZmVzdChmaWxlLCBtYW5pZmVzdFBhdGgpOwotCQkJcmV0dXJuIG1hbmlmZXN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZU1hbmlmZXN0IGdldE1hbmlmZXN0KElGaWxlIGYpIHsKLQkJRmlsZSBmMiA9IGYuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJcmV0dXJuIGdldE1hbmlmZXN0KGYyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlTWFuaWZlc3QgZ2V0TWFuaWZlc3QoRmlsZSBmKSB7Ci0JCWlmKCBmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotCQkJCUlucHV0U3RyZWFtIGluOwotCQkJCXRyeSB7Ci0JCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLQkJCQkJQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQkJCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVNYW5pZmVzdChJRmlsZSBhRmlsZSwgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGFGaWxlKTsKLQkJbWFuaWZlc3Qud3JpdGVTcGxpdHRpbmdDbGFzc3BhdGgob3V0KTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBBcmNoaXZlTWFuaWZlc3QgZ2V0Tm9uQmluYXJ5Q29tcG9uZW50TWFuaWZlc3QoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJUGF0aCBtYW5pZmVzdFBhdGgpIHsKLQkJdHJ5IHsKLQkJCWlmKCFjb21wb25lbnQuaXNCaW5hcnkoKSl7Ci0JCQkJSVZpcnR1YWxGaWxlIHZNYW5pZmVzdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShtYW5pZmVzdFBhdGgpOwotCQkJCWlmICh2TWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQkJSUZpbGUgbWFuaWZlc3RGaWxlID0gdk1hbmlmZXN0LmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluID0gbWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJCQlBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChpbik7Ci0JCQkJCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQkJaW4gPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJfSBjYXRjaCggSU9FeGNlcHRpb24gaW9lICkgewotCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRNYW5pZmVzdENsYXNzcGF0aChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElQYXRoIG1hbmlmZXN0UGF0aCkgIHsKLQkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gZ2V0TWFuaWZlc3QoY29tcG9uZW50LCBtYW5pZmVzdFBhdGgpOwotCQlpZiggbWYgIT0gbnVsbCApIAotCQkJcmV0dXJuIG1mLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1tde307Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZU1hbmlmZXN0IHJlYWRCaW5hcnlNYW5pZmVzdChGaWxlIGZpbGUsIElQYXRoIG1hbmlmZXN0UGF0aCkgewotCQlBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QgPSBudWxsOwotCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQlpZiggZmlsZSAhPSBudWxsICkgewotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gTWFuaWZlc3RVdGlsaXRpZXMubmV3WmlwRmlsZShmaWxlKTsKLQkJCQlaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkobWFuaWZlc3RQYXRoLnRvU3RyaW5nKCkpOwotCQkJCWlmKCBlbnRyeSAhPSBudWxsICkgewotCQkJCQlJbnB1dFN0cmVhbSBlbnRyeVN0cmVhbSA9IGdldElucHV0c3RyZWFtRm9yWmlwRW50cnkoemlwRmlsZSwgbWFuaWZlc3RQYXRoLnRvU3RyaW5nKCkpOwotCQkJCQltYW5pZmVzdCA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGVudHJ5U3RyZWFtKTsKLQkJCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2goIElPRXhjZXB0aW9uIGlvZSkgewotCQkJCWlmKCB6aXBGaWxlICE9IG51bGwgKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2goIElPRXhjZXB0aW9uIGlvZTIpIHt9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYW5pZmVzdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dHN0cmVhbUZvclppcEVudHJ5KFppcEZpbGUgemlwRmlsZSwgU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeSh1cmkpOwotCQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIGEgaGFjaywgYnV0IHppcCBmaWxlcyBhcmUgc2Vuc2l0aXZlIHRvIHRoZSBkaWZmZXJlbmNlCi0JCQkJLy8gYmV0d2VlbiAnLycgYW5kICdcXCcKLQkJCQkvLyBzbyB0aGUgaGFjayBpcyB0byB0cnkgYWxsIGNvbWJpbmF0aW9ucyB0byBzZWUgaWYgYW55IGV4aXN0Ci0JCQkJY2hhcltdIGNoYXJzID0gdXJpLnRvQ2hhckFycmF5KCk7Ci0JCQkJaW50W10gc2xhc2hJbmRpY2VzID0gbmV3IGludFtjaGFycy5sZW5ndGhdOwotCQkJCWludCBzbGFzaENvdW50ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmIChjaGFyc1tpXSA9PSAnLycgfHwgY2hhcnNbaV0gPT0gJ1xcJykgewotCQkJCQkJc2xhc2hJbmRpY2VzW3NsYXNoQ291bnRdID0gaTsKLQkJCQkJCXNsYXNoQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpbnQgc2xhc2hQb3cgPSAoaW50KSBNYXRoLnBvdygyLCBzbGFzaENvdW50KTsKLQkJCQlib29sZWFuIGZvdW5kSXQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNsYXNoUG93ICYmICFmb3VuZEl0OyBpKyspIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzbGFzaENvdW50OyBqKyspIHsKLQkJCQkJCWlmICgoaSA+PiBqICYgMSkgPT0gMSkgewotCQkJCQkJCWNoYXJzW3NsYXNoSW5kaWNlc1tqXV0gPSAnLyc7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNoYXJzW3NsYXNoSW5kaWNlc1tqXV0gPSAnXFwnOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeShuZXcgU3RyaW5nKGNoYXJzKSk7Ci0JCQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCQlmb3VuZEl0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJCQlFeGNlcHRpb24gZGVsID0gbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZGVsLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHppcENsb3NlZCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHppcENsb3NlZC50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE5vbkJpbmFyeUNvbXBvbmVudE1hbmlmZXN0Q2xhc3NwYXRoKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVBhdGggbWFuaWZlc3RQYXRoKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gbWFuaWZlc3RDbGFzc3BhdGggPSBudWxsOwotCQlpZighY29tcG9uZW50LmlzQmluYXJ5KCkpewotCQkJSVZpcnR1YWxGaWxlIHZNYW5pZmVzdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShtYW5pZmVzdFBhdGgpOwotCQkJaWYgKHZNYW5pZmVzdC5leGlzdHMoKSkgewotCQkJCUlGaWxlIG1hbmlmZXN0RmlsZSA9IHZNYW5pZmVzdC5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbiA9IG1hbmlmZXN0RmlsZS5nZXRDb250ZW50cygpOwotCQkJCQlBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChpbik7Ci0JCQkJCW1hbmlmZXN0Q2xhc3NwYXRoID0gbWFuaWZlc3QuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQlpbiA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBtYW5pZmVzdENsYXNzcGF0aDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFppcEZpbGUgbmV3WmlwRmlsZShTdHJpbmcgZmlsZU5hbWUpdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gTWFuaWZlc3RVdGlsaXRpZXMubmV3WmlwRmlsZShuZXcgRmlsZShmaWxlTmFtZSksIFppcEZpbGUuT1BFTl9SRUFEKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBaaXBGaWxlIG5ld1ppcEZpbGUoRmlsZSBhRmlsZSl0aHJvd3MgWmlwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBNYW5pZmVzdFV0aWxpdGllcy5uZXdaaXBGaWxlKGFGaWxlLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JfQotCQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIFppcEZpbGVzIHdoaWNoIGF2b2lkIG1lbW9yeSBsZWFrcyAKLQkgKiBiZWNhdXNlIGNsb3NpbmcgdGhlbSBmYWlscyB0byBjbG9zZSBvcGVuIGlucHV0c3RyZWFtcy4KLQkgKiBUaGVyZSBpcyBhIFNVTiBidWcgb3BlbiBmb3IgdGhpczogaHR0cDovL2J1Z3Muc3VuLmNvbS9idWdkYXRhYmFzZS92aWV3X2J1Zy5kbz9idWdfaWQ9NjczNTI1NSAKLSAgICAgKiBidXQgaXQgbG9va3MgbGlrZSB0aGUgImZpeCIgd2lsbCBiZSB0byBjaGFuZ2UgdGhlIEphdmFkb2MgOi0oICAgCi0JICogQHBhcmFtIGFGaWxlIG1vZGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBaaXBFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBaaXBGaWxlIG5ld1ppcEZpbGUoRmlsZSBhRmlsZSwgaW50IG1vZGUpIHRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBaaXBGaWxlKGFGaWxlLCBtb2RlKXsKLQkJCUNvbGxlY3Rpb24gPElucHV0U3RyZWFtPiBvcGVuU3RyZWFtcyA9IG51bGw7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFppcEVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCUlucHV0U3RyZWFtIGluID0gc3VwZXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCQkJCWlmKGluICE9IG51bGwpewotCQkJCQlpZihvcGVuU3RyZWFtcyA9PSBudWxsKXsKLQkJCQkJCW9wZW5TdHJlYW1zID0gbmV3IEFycmF5TGlzdDxJbnB1dFN0cmVhbT4oKTsKLQkJCQkJfQotCQkJCQlvcGVuU3RyZWFtcy5hZGQoaW4pOwotCQkJCX0KLQkJCQlyZXR1cm4gaW47Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCWNsb3NlT3BlblN0cmVhbXMoKTsKLQkJCQlzdXBlci5jbG9zZSgpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgY2xvc2VPcGVuU3RyZWFtcygpIHsKLQkJCQlpZihvcGVuU3RyZWFtcyAhPSBudWxsKXsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG9wZW5TdHJlYW1zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCUlucHV0U3RyZWFtIGluID0gKElucHV0U3RyZWFtKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKGUpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQXJjaGl2ZU1hbmlmZXN0IHJlYWRNYW5pZmVzdChJRmlsZSBhRmlsZSkgewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoYUZpbGUgPT0gbnVsbCB8fCAhYUZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpbiA9IGFGaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlyZXR1cm4gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gSjJFRVBsdWdpbi5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB3ZVRyaWVkKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hbmlmZXN0Q2xhc3NwYXRocyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBuZXcgTUFOSUZFU1QuTUYgd2l0aCBhIGR5bmFtaWNhbGx5IHVwZGF0ZWQgY2xhc3NwYXRoIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkCi0JICogb3V0cHV0IHN0cmVhbS4KLQkgKiBAcGFyYW0gbWFuaWZlc3RGaWxlIFRoZSBjdXJyZW50IE1BTklGRVNULk1GIGZpbGUuCi0JICogQHBhcmFtIGR5bmFtaWNVUklzIElzIExpc3Qgb2YgVVJJcyB0byBkeW5hbWljYWxseSBhZGQgdG8gdGhlIG1hbmlmZXN0IGNsYXNzcGF0aC4KLQkgKiBAcGFyYW0gb3V0cHV0U3RyZWFtIFN0cmVhbSB0byB3aGljaCB0aGUgbW9kaWZpZWQgZW50cnkgc2hvdWxkIGJlIHdyaXR0ZW4uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKGZpbmFsIElGaWxlIG1hbmlmZXN0RmlsZSwgZmluYWwgTGlzdCBkeW5hbWljVVJJcywgZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl1cGRhdGVNYW5pZmVzdENsYXNzcGF0aEltcGwobWFuaWZlc3RGaWxlLCBkeW5hbWljVVJJcywgbnVsbCwgb3V0cHV0U3RyZWFtKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGVzIG5ldyBNQU5JRkVTVC5NRiB3aXRoIGEgZHluYW1pY2FsbHkgdXBkYXRlZCBjbGFzc3BhdGggdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBvdXRwdXQgc3RyZWFtLgotCSAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgVGhlIGN1cnJlbnQgTUFOSUZFU1QuTUYgZmlsZS4KLQkgKiBAcGFyYW0gZHluYW1pY1VSSXMgSXMgTGlzdCBvZiBVUklzIHRvIGR5bmFtaWNhbGx5IGFkZCB0byB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoLgotCSAqIEBwYXJhbSBvdXRwdXRGaWxlIEZpbGUgdG8gd2hpY2ggdGhlIG1vZGlmaWVkIGVudHJ5IHNob3VsZCBiZSB3cml0dGVuLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVNYW5pZmVzdENsYXNzcGF0aChmaW5hbCBJRmlsZSBtYW5pZmVzdEZpbGUsIGZpbmFsIExpc3QgZHluYW1pY1VSSXMsIGZpbmFsIEZpbGUgb3V0cHV0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQl1cGRhdGVNYW5pZmVzdENsYXNzcGF0aEltcGwobWFuaWZlc3RGaWxlLCBkeW5hbWljVVJJcywgb3V0cHV0RmlsZSwgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIG5ldyBNQU5JRkVTVC5NRiB3aXRoIGEgZHluYW1pY2FsbHkgdXBkYXRlZCBjbGFzc3BhdGggdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlIG9yIG91dHB1dCBzdHJlYW0sIHdpdGggdGhlIHN0cmVhbSB0YWtpbmcgcHJlY2VkZW5jZS4KLQkgKiBAcGFyYW0gbWFuaWZlc3RGaWxlIFRoZSBjdXJyZW50IE1BTklGRVNULk1GIGZpbGUuCi0JICogQHBhcmFtIGR5bmFtaWNVUklzIElzIExpc3Qgb2YgVVJJcyB0byBkeW5hbWljYWxseSBhZGQgdG8gdGhlIG1hbmlmZXN0IGNsYXNzcGF0aC4KLQkgKiBAcGFyYW0gb3V0cHV0RmlsZSBGaWxlIHRvIHdoaWNoIHRoZSBtb2RpZmllZCBlbnRyeSBzaG91bGQgYmUgd3JpdHRlbi4KLQkgKiBAcGFyYW0gT3V0cHV0U3RyZWFtIHN0cmVhbSBTdHJlYW0gdG8gd2hpY2ggdGhlIG1vZGlmaWVkIGVudHJ5IHNob3VsZCBiZSB3cml0dGVuLiBJZiBub3QgbnVsbCwKLQkgKiB0aGUgc3RyZWFtIHdpbGwgYmUgd3JpdHRlbiBhbmQgdGhlIG91dHB1dEZpbGUgaWdub3JlZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoSW1wbChmaW5hbCBJRmlsZSBtYW5pZmVzdEZpbGUsIGZpbmFsIExpc3QgZHluYW1pY1VSSXMsIGZpbmFsIEZpbGUgb3V0cHV0RmlsZSwgZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQkKLQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IHN0cmVhbTsgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIAlBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3QgPSBudWxsOwotICAgICAgICAJdHJ5IHsKLSAgICAgICAgCQlpbiA9IG1hbmlmZXN0RmlsZS5nZXRDb250ZW50cygpOwotICAgICAgICAJCW1hbmlmZXN0ID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotICAgICAgICAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAJfSBmaW5hbGx5IHsKLSAgICAgICAgCQlpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAJCQl0cnkgewotICAgICAgICAJCQkJaW4uY2xvc2UoKTsKLSAgICAgICAgCQkJCWluID0gbnVsbDsKLSAgICAgICAgCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKGUpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICAJZmluYWwgU3RyaW5nW10gbWFuaWZlc3RDbGFzc3BhdGggPSBtYW5pZmVzdC5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLSAgICAgICAgCWZpbmFsIExpc3QgdXBkYXRlZENQID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBtYW5pZmVzdENsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotICAgICAgICAJCXVwZGF0ZWRDUC5hZGQobWFuaWZlc3RDbGFzc3BhdGhbaV0pOwotICAgICAgICAJfQotICAgICAgICAJLy8gdXBkYXRlIG1hbmlmZXN0IGNsYXNzcGF0aCB0byBpbmNsdWRlIGR5bmFtaWMgZW50cmllcwotICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCBkeW5hbWljVVJJcy5zaXplKCk7IGorKykgewotICAgICAgICAJCWZpbmFsIFN0cmluZyBjb250YWluZXJVUkkgPSAoU3RyaW5nKSBkeW5hbWljVVJJcy5nZXQoaik7Ci0gICAgICAgIAkJLy8gbmVlZCB0byBjaGVjayBleGlzdGluZyBlbnRyaWVzIHRvIGVuc3VyZSBpdCBkb2Vzbid0IGFyZSBleGlzdCBvbiB0aGUgY2xhc3NwYXRoCi0gICAgICAgIAkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgCQlmb3IgKGludCBpID0gMDsgaSA8IG1hbmlmZXN0Q2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAkJCWlmIChtYW5pZmVzdENsYXNzcGF0aFtpXS5lcXVhbHMoY29udGFpbmVyVVJJKSkgewotICAgICAgICAJCQkJZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgCQkJCWJyZWFrOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJCWlmICghZXhpc3RzKSB7Ci0gICAgICAgIAkJCXVwZGF0ZWRDUC5hZGQoY29udGFpbmVyVVJJKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIAlmaW5hbCBTdHJpbmdCdWZmZXIgY3BCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIAlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgCWZvciAoaW50IGogPSAwOyBqIDwgdXBkYXRlZENQLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIAkJaWYgKCFmaXJzdCkgewotICAgICAgICAJCQljcEJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCX0gZWxzZSB7Ci0gICAgICAgIAkJCWZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIAkJfQotICAgICAgICAJCWNwQnVmZmVyLmFwcGVuZCgoU3RyaW5nKSB1cGRhdGVkQ1AuZ2V0KGopKTsKLSAgICAgICAgCX0KLSAgICAgICAgCVN0cmluZyBjcCA9IGNwQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIAkvLyBJZiB3ZSBoYXZlIGFuIG91dHB1dCBzdHJlYW0sIGFsd2F5cyB3cml0ZSB0byB0aGUgc3RyZWFtIAotICAgICAgICAJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJbWFuaWZlc3Quc2V0Q2xhc3NQYXRoKGNwKTsKLSAgICAgICAgICAgIAltYW5pZmVzdC53cml0ZShvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgCW91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAJfQotICAgICAgICAJLy8gRWxzZSwgd2l0aG91dCBhbiBvdXRwdXQgc3RyZWFtLCBjb25kaXRpb25hbGx5IHVwZGF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUKLSAgICAgICAgCWVsc2UgewotICAgICAgICAJCS8vIFRvIGF2b2lkIG1ha2luZyB0aGUgaW50ZXJuYWxseSBnZW5lcmF0ZWQgbWFuaWZlc3QgZmlsZSBhcHBlYXIgdG8gcHJvamVjdHMKLSAgICAgICAgCQkvLyBhcyBhIHBlcnBldHVhbGx5IG1vZGlmaWVkIHJlc291cmNlLCBjaGVjayBpZiB0aGUgZmlsZSBuZWVkcyB0byBjaGFuZ2UuCi0gICAgICAgIAkJLy8gVGhpcyBjaGVja2luZyBoZWxwcyB3aXRoIHRoZSB1c2VmdWxuZXNzIG9mICJkZWx0YSIgZGVwbG95bWVudCB3aXRoCi0gICAgICAgIAkJLy8gdXRpbGl0eSBwcm9qZWN0cy4KLSAgICAgICAgICAgIAlTdHJpbmcgbWFuaWZlc3RQYXRoID0gbWFuaWZlc3RGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIAlTdHJpbmcgcHJpb3JDbGFzc3BhdGggPSBtYW5pZmVzdENsYXNzcGF0aHMuZ2V0KG1hbmlmZXN0UGF0aCk7Ci0gICAgICAgICAgICAJaWYgKHByaW9yQ2xhc3NwYXRoID09IG51bGwgfHwgIXByaW9yQ2xhc3NwYXRoLmVxdWFscyhjcCkgfHwgIW91dHB1dEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAJbWFuaWZlc3RDbGFzc3BhdGhzLnB1dChtYW5pZmVzdFBhdGgsIGNwKTsKLSAgICAgICAgICAgICAgICAJbWFuaWZlc3Quc2V0Q2xhc3NQYXRoKGNwKTsKLSAgICAgICAgICAgICAgICAJb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgCW1hbmlmZXN0LndyaXRlKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgCW91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgCX0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MmU4NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JLyoqCi0JICogUHJvamVjdCBuYW1lIHdpdGggbWFuaWZlc3QgdG8gdXBkYXRlLCB0eXBlIFN0cmluZyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogamF2YS51dGlsLkxpc3Qgb2YgU3RyaW5ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9MSVNUID0gIlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLkNMQVNTUEFUSF9MSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nLiBUaGlzIGlzIGJ1aWxkIGZyb20gdGhlIEpBUl9MSVNUIHByb3BlcnR5LiBOZXZlciBzZXQgdGhpcyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfTElTVF9URVhUX1VJID0gIlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLkNMQVNTUEFUSF9MSVNUX1RFWFRfVUkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCb29sZWFuLCB0cnVlIG1lcmdlcywgZmFsc2UgcmVwbGFjZXMsIGRlZmF1bHQgaXMgdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFID0gIlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLk1FUkdFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nLCBubyBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fQ0xBU1MgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuTUFJTl9DTEFTUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCi0JLyoqCi0JICogU3RyaW5nLCBubyBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0ZJTEUgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuTUFOSUZFU1RfRklMRSI7IC8vJE5PTi1OTFMtMSQJCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM4NzE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEpBUl9MSVNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSkFSX0xJU1RfVEVYVF9VSSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1FUkdFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTUFJTl9DTEFTUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1BTklGRVNUX0ZJTEUpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE1FUkdFKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBUl9MSVNUKSkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBUl9MSVNUX1RFWFRfVUkpKSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoQXNTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBzZXQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVJfTElTVCkgJiYgaXNQcm9wZXJ0eVNldChKQVJfTElTVF9URVhUX1VJKSkKLQkJCXNldFByb3BlcnR5KEpBUl9MSVNUX1RFWFRfVUksIGdldENsYXNzcGF0aEFzU3RyaW5nKCkpOwotCQlyZXR1cm4gc2V0OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aEFzU3RyaW5nKCkgewotCQlMaXN0IGNsYXNzcGF0aExpc3QgPSAoTGlzdCkgZ2V0UHJvcGVydHkoSkFSX0xJU1QpOwotCQlyZXR1cm4gY29udmVydENsYXNzcGF0aExpc3RUb1N0cmluZyhjbGFzc3BhdGhMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2xhc3NwYXRoTGlzdFRvU3RyaW5nKExpc3QgbGlzdCkgewotCQlTdHJpbmcgY2xhc3NwYXRoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQljbGFzc3BhdGhTdHJpbmcgKz0gKChTdHJpbmcpIGxpc3QuZ2V0KGkpKSArICIgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjbGFzc3BhdGhTdHJpbmcudHJpbSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBjb252ZXJ0Q2xhc3NwYXRoU3RyaW5nVG9MaXN0KFN0cmluZyBzdHJpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24obW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjU1ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDEzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpbW9kZWwuZ2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BTklGRVNUX0ZJTEUpOwotCQkKLQkJU3RyaW5nIGNsYXNzUGF0aFZhbHVlID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNUX1RFWFRfVUkpOwotCQl0cnkgewotCQkJaWYoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBNYW5pZmVzdFV0aWxpdGllcy5yZWFkTWFuaWZlc3QoZmlsZSk7Ci0JCQkJCi0JCQkJaWYgKG1mID09IG51bGwpCi0JCQkJCW1mID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKTsKLQkJCQltZi5hZGRWZXJzaW9uSWZOZWNlc3NhcnkoKTsKLQkJCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NRVJHRSkpIHsKLQkJCQkJbWYubWVyZ2VDbGFzc1BhdGgoTWFuaWZlc3RVdGlsaXRpZXMuZ2V0VG9rZW5zKGNsYXNzUGF0aFZhbHVlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWYuc2V0Q2xhc3NQYXRoKGNsYXNzUGF0aFZhbHVlKTsKLQkJCQl9Ci0JCQkJaWYgKG1vZGVsLmlzUHJvcGVydHlTZXQoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BSU5fQ0xBU1MpKSB7Ci0JCQkJCW1mLnNldE1haW5DbGFzcyhtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9DTEFTUykpOwotCQkJCX0KLQkKLQkJCQlNYW5pZmVzdFV0aWxpdGllcy53cml0ZU1hbmlmZXN0KGZpbGUsIG1mKTsKLQkJCX0KLQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksZXgpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRjYjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzcGF0aERlY29yYXRpb25zCi17Ci0gICAgcHJpdmF0ZSBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKLSAgICBwcml2YXRlIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBleHRyYUF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUF0dGFjaG1lbnRQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VBdHRhY2htZW50UGF0aCggZmluYWwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGggKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2VBdHRhY2htZW50UGF0aCA9IHNvdXJjZUF0dGFjaG1lbnRQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCBmaW5hbCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGggKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPSBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJQ2xhc3NwYXRoQXR0cmlidXRlW10gZ2V0RXh0cmFBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhcnJheSAKLSAgICAgICAgICAgID0gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLnNpemUoKSBdOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChJQ2xhc3NwYXRoQXR0cmlidXRlW10pIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLnRvQXJyYXkoIGFycmF5ICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhQXR0cmlidXRlcyggZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzICkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4dHJhQXR0cmlidXRlcy5hZGQoIGF0dHJzWyBpIF0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dHJhQXR0cmlidXRlKCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyCi0gICAgICAgICAgICA9IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuZXh0cmFBdHRyaWJ1dGVzLmFkZCggYXR0ciApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2UxZDE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyCi17Ci0JcHJpdmF0ZSBmaW5hbCBGaWxlIGY7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwIGRlY29yYXRpb25zOwotICAgIAotICAgIHB1YmxpYyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIoIGZpbmFsIFN0cmluZyBwbHVnaW4gKQotICAgIHsKLSAgICAgICAgZmluYWwgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgZmluYWwgRmlsZSB3c2RpciA9IHdzLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotICAgICAgICBmaW5hbCBGaWxlIHdzbWRyb290ID0gbmV3IEZpbGUoIHdzZGlyLCAiLm1ldGFkYXRhLy5wbHVnaW5zIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZpbmFsIEZpbGUgcG1kcm9vdCA9IG5ldyBGaWxlKCB3c21kcm9vdCwgcGx1Z2luICk7Ci0gICAgCi0gICAgICAgIHRoaXMuZiA9IG5ldyBGaWxlKCBwbWRyb290LCAiY2xhc3NwYXRoLmRlY29yYXRpb25zLnhtbCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gcmVhZCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZ2V0RGVjb3JhdGlvbnMoIGZpbmFsIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50cnkgKQotICAgIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcCBzdWJtYXAgPSAoSGFzaE1hcCkgdGhpcy5kZWNvcmF0aW9ucy5nZXQoIGtleSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHN1Ym1hcCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoQ2xhc3NwYXRoRGVjb3JhdGlvbnMpIHN1Ym1hcC5nZXQoIGVudHJ5ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjb3JhdGlvbnMoIGZpbmFsIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZGVjICkKLSAgICB7Ci0gICAgCUhhc2hNYXAgc3VibWFwID0gKEhhc2hNYXApIHRoaXMuZGVjb3JhdGlvbnMuZ2V0KCBrZXkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdWJtYXAgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1Ym1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zLnB1dCgga2V5LCBzdWJtYXAgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3VibWFwLnB1dCggZW50cnksIGRlYyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbGVhckFsbERlY29yYXRpb25zKCBmaW5hbCBTdHJpbmcga2V5ICkKLSAgICB7Ci0gICAgCXRoaXMuZGVjb3JhdGlvbnMucmVtb3ZlKCBrZXkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGUgZm9sZGVyID0gdGhpcy5mLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIGZvbGRlci5leGlzdHMoKSAmJiAhIGZvbGRlci5ta2RpcnMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgUHJpbnRXcml0ZXIgdyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdyA9IG5ldyBQcmludFdyaXRlciggbmV3IEJ1ZmZlcmVkV3JpdGVyKCBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBuZXcgRmlsZU91dHB1dFN0cmVhbSggdGhpcy5mICksICJVVEYtOCIgKSApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgCi0gICAgICAgICAgICB3LnByaW50bG4oICI8Y2xhc3NwYXRoPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjEgPSBkZWNvcmF0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IAotICAgICAgICAgICAgICAgICBpdHIxLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeSBlbnRyeTEgPSAoTWFwLkVudHJ5KSBpdHIxLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXAgc3VibWFwID0gKE1hcCkgZW50cnkxLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdy5wcmludCggIiAgPGNvbnRhaW5lciBpZD1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHcucHJpbnQoIChTdHJpbmcpIGVudHJ5MS5nZXRLZXkoKSApOwotICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIlwiPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMiA9IHN1Ym1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IAotICAgICAgICAgICAgICAgICAgICAgaXRyMi5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeSBlbnRyeTIgPSAoTWFwLkVudHJ5KSBpdHIyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gKENsYXNzcGF0aERlY29yYXRpb25zKSBlbnRyeTIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHcucHJpbnQoICIgICAgPGVudHJ5IGlkPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIChTdHJpbmcpIGVudHJ5Mi5nZXRLZXkoKSApOwotICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICJcIj4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBkZWMuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICAgIDxzb3VyY2UtYXR0YWNobWVudC1wYXRoPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludGxuKCAiPC9zb3VyY2UtYXR0YWNobWVudC1wYXRoPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIiAgICAgIDxzb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCBkZWMuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludGxuKCAiPC9zb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRycyAKLSAgICAgICAgICAgICAgICAgICAgICAgID0gZGVjLmdldEV4dHJhQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0ciA9IGF0dHJzWyBpIF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoICIgICAgICA8YXR0cmlidXRlIG5hbWU9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGF0dHIuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiXCI+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCBhdHRyLmdldFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIjwvYXR0cmlidXRlPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICIgICAgPC9lbnRyeT4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdy5wcmludGxuKCAiICA8L2NvbnRhaW5lcj4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdy5wcmludGxuKCAiPC9jbGFzc3BhdGg+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmxvZyggZSApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAJaWYobnVsbCAhPSB3KXsKLSAgICAgICAgCQl3LmNsb3NlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHJlYWQoKQotICAgIHsKLSAgICAgICAgZmluYWwgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiggISB0aGlzLmYuZXhpc3RzKCkgKSByZXR1cm4gbWFwOwotCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgRWxlbWVudCByb290ID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5IAotICAgICAgICAgICAgICAgID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgZG9jYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlciggbmV3IEZpbGVJbnB1dFN0cmVhbSggZi5nZXRQYXRoKCkpLCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcm9vdCA9IGRvY2J1aWxkZXIucGFyc2UoIG5ldyBJbnB1dFNvdXJjZShpbikpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGluICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjEgPSBlbGVtZW50cyggcm9vdCwgImNvbnRhaW5lciIgKTsgaXRyMS5oYXNOZXh0KCk7ICkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBFbGVtZW50IGUxID0gKEVsZW1lbnQpIGl0cjEubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNpZCA9IGUxLmdldEF0dHJpYnV0ZSggImlkIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEhhc2hNYXAgc3VibWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG1hcC5wdXQoIGNpZCwgc3VibWFwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMiA9IGVsZW1lbnRzKCBlMSwgImVudHJ5IiApOyBpdHIyLmhhc05leHQoKTsgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlMiA9IChFbGVtZW50KSBpdHIyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZWlkID0gZTIuZ2V0QXR0cmlidXRlKCAiaWQiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgPSBuZXcgQ2xhc3NwYXRoRGVjb3JhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdWJtYXAucHV0KCBlaWQsIGRlYyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMyA9IGVsZW1lbnRzKCBlMiApOyBpdHIzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlMyA9IChFbGVtZW50KSBpdHIzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG4gPSBlMy5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIG4uZXF1YWxzKCAic291cmNlLWF0dGFjaG1lbnQtcGF0aCIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjLnNldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCBuZXcgUGF0aCggdGV4dCggZTMgKSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbi5lcXVhbHMoICJzb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGgiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYy5zZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoIG5ldyBQYXRoKCB0ZXh0KCBlMyApICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBuLmVxdWFscyggImF0dHJpYnV0ZSIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBlMy5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWMuYWRkRXh0cmFBdHRyaWJ1dGUoIG5hbWUsIHRleHQoIGUzICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRleHQoIGZpbmFsIEVsZW1lbnQgZWwgKQotICAgIHsKLSAgICAgICAgZmluYWwgTm9kZUxpc3Qgbm9kZXMgPSBlbC5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgU3RyaW5nIHN0ciA9IG51bGw7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSBub2Rlcy5nZXRMZW5ndGgoKTsgaSA8IG47IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oIGkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGJ1ZiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHZhbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBzdHIgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHN0ciApOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCB2YWwgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN0ciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IHZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBidWYgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJdGVyYXRvciBlbGVtZW50cyggZmluYWwgRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRzSXRlcmF0b3IoIGVsLCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhdG9yIGVsZW1lbnRzKCBmaW5hbCBFbGVtZW50IGVsICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudHNJdGVyYXRvciggZWwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFbGVtZW50c0l0ZXJhdG9yCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSXRlcmF0b3IKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIE5vZGVMaXN0IG5vZGVzOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgaW50IHBvc2l0aW9uOwotICAgICAgICBwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotICAgICAgICBwdWJsaWMgRWxlbWVudHNJdGVyYXRvciggZmluYWwgRWxlbWVudCBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5vZGVzID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gLTE7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotCi0gICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWR2YW5jZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLnBvc2l0aW9uKys7Ci0KLSAgICAgICAgICAgIGZvciggOyB0aGlzLnBvc2l0aW9uIDwgdGhpcy5sZW5ndGggJiYgdGhpcy5lbGVtZW50ID09IG51bGw7IAotICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIE5vZGUgbm9kZSA9IHRoaXMubm9kZXMuaXRlbSggdGhpcy5wb3NpdGlvbiApOwotCi0gICAgICAgICAgICAgICAgaWYoIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJgotICAgICAgICAgICAgICAgICAgICAoIHRoaXMubmFtZSA9PSBudWxsIHx8IAotICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIHRoaXMubmFtZSApICkgKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSAKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICggdGhpcy5lbGVtZW50ICE9IG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBFbGVtZW50IGVsID0gdGhpcy5lbGVtZW50OwotCi0gICAgICAgICAgICBpZiggZWwgPT0gbnVsbCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkdmFuY2UoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNjFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhVdGlsCi17Ci0gICAgcHJpdmF0ZSBDbGFzc3BhdGhVdGlsKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldCBnZXRSZXNvbHZlZENsYXNzcGF0aCggZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBlbnRyeVRvSWdub3JlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSZXNvbHZlZENsYXNzcGF0aCgganByb2osIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggZW50cnlUb0lnbm9yZSApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0IGdldFJlc29sdmVkQ2xhc3NwYXRoKCBmaW5hbCBJSmF2YVByb2plY3QganByb2osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldCBlbnRyaWVzVG9JZ25vcmUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0IHJlc29sdmVkID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSAKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbIGkgXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZW50cmllc1RvSWdub3JlLmNvbnRhaW5zKCBlbnRyeS5nZXRQYXRoKCkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBlbnRyeS5nZXRFbnRyeUtpbmQoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmFkZCggZW50cnkuZ2V0UGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeSggZW50cnkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVudHJ5ICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmFkZCggZW50cnkuZ2V0UGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoIGVudHJ5LmdldFBhdGgoKSwganByb2ogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb250YWluZXIgIT0gbnVsbCApIAotICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNvbnRhaW5lckVudHJpZXMKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQotCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGorKyApCi0JICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZC5hZGQoIGNvbnRhaW5lckVudHJpZXNbIGogXS5nZXRQYXRoKCkgKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApIAotICAgICAgICB7Ci0gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc29sdmVkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZGI2MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFjY2Vzc1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxleGlibGVQcm9qZWN0Q29udGFpbmVyCi0KLSAgICBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXIKLQotewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aFR5cGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aFR5cGUgCi0gICAgICAgICAgICBMSUJfRElSRUNUT1JZID0gbmV3IFBhdGhUeXBlKCksCi0gICAgICAgICAgICBDTEFTU0VTX0RJUkVDVE9SWSA9IG5ldyBQYXRoVHlwZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZGVjb3JhdGlvbnM7IAotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb3VyY2UgbGlzdGVuZXIgdGhhdCB3aWxsIGxpc3RlbiBmb3IgY2hhbmdlcyB0bwotICAgICAgICAvLyByZXNvdXJjZXMgcmVsZXZhbnQgdG8gZmxleGlibGUgcHJvamVjdCBjb250YWluZXJzIGFjcm9zcyB0aGUKLSAgICAgICAgLy8gd29ya3NwYWNlIGFuZCByZWZyZXNoIHRoZW0gYXMgbmVjZXNzYXJ5LgotICAgICAgICAKLSAgICAgICAgTGlzdGVuZXIucmVnaXN0ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJlYWQgdGhlIGRlY29yYXRpb25zIGZyb20gdGhlIHdvcmtzcGFjZSBtZXRhZGF0YS4KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFN0cmluZyBwbHVnaW4gPSBDb21tb25GcmFtZXdvcmtzUGx1Z2luLlBMVUdJTl9JRDsKLSAgICAgICAgZGVjb3JhdGlvbnMgPSBuZXcgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyKCBwbHVnaW4gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIiEiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVjb3JhdGlvbk1hbmFnZXJLZXkoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbnRhaW5lcil7Ci0gICAgCXJldHVybiBwcm9qZWN0LmdldE5hbWUoKSArIFNFUEFSQVRPUiArIGNvbnRhaW5lcjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIElQYXRoIHBhdGg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIElKYXZhUHJvamVjdCBvd25lcjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIGZpbmFsIElQYXRoW10gcGF0aHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQYXRoVHlwZVtdIHBhdGhUeXBlczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdCBlbnRyaWVzOwotICAgIHByaXZhdGUgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3BlbnRyaWVzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBjb250YWluZXJUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgCi0gICAgcHVibGljIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lciggZmluYWwgSVBhdGggcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3Qgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aFtdIHBhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGhUeXBlW10gdHlwZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICB0aGlzLnBhdGhzID0gcGF0aHM7Ci0gICAgICAgIHRoaXMucGF0aFR5cGVzID0gdHlwZXM7Ci0gICAgICAgIAotICAgICAgICBpZiggISBpc0ZsZXhpYmxlUHJvamVjdCggdGhpcy5wcm9qZWN0ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTaWxlbnRseSBub29wIGlmIHRoZSByZWZlcmVuY2VkIHByb2plY3QgaXMgbm90IGEgZmxleGlibGUKLSAgICAgICAgICAgIC8vIHByb2plY3QuIFNob3VsZCBJIGJlIGRvaW5nIHNvbWV0aGluZyBlbHNlIGhlcmU/Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuZW50cmllcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICB0aGlzLmNwZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbIDAgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhZGRGbGV4aWJsZVByb2plY3RDb250YWluZXJUeXBlKCBwYXRoLnNlZ21lbnQoIDAgKSApOwotICAgICAgICAKLSAgICAgICAgdGhpcy5lbnRyaWVzID0gY29tcHV0ZUNsYXNzcGF0aEVudHJpZXMoKTsKLSAgICAgICAgdGhpcy5jcGVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5WyB0aGlzLmVudHJpZXMuc2l6ZSgpIF07Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IHRoaXMuZW50cmllcy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBJUGF0aCBlbnRyeVBhdGggPSAoSVBhdGgpIHRoaXMuZW50cmllcy5nZXQoIGkgKTsKLSAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9UmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGVudHJ5UGF0aCk7IAotICAgICAgICAgICAgaWYobnVsbCAhPSByZXNvdXJjZSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0gICAgICAgICAgICAgICAgdGhpcy5jcGVudHJpZXNbIGkgXSA9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShlbnRyeVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0aGlzLmNwZW50cmllc1sgaSBdID0gbmV3TGlicmFyeUVudHJ5KCBlbnRyeVBhdGggKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEtfQVBQTElDQVRJT047Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFBhdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY3BlbnRyaWVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc091dE9mRGF0ZSggZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgKQotICAgIHsKLSAgICAgICAgaWYoIGRlbHRhID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzT3V0T2ZEYXRlKCk7Ci0gICAgfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdXRPZkRhdGUoKSB7Ci0JCWZpbmFsIExpc3QgY3VycmVudEVudHJpZXMgPSBjb21wdXRlQ2xhc3NwYXRoRW50cmllcygpOwotICAgICAgICByZXR1cm4gISB0aGlzLmVudHJpZXMuZXF1YWxzKCBjdXJyZW50RW50cmllcyApOwotCX0KLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWZyZXNoKCk7Ci0gICAgCi0JLyoqCi0JICogSWYgZm9yY2VVcGRhdGUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZW4gYSByZWZyZXNoIGlzIG1hZGUgb25seSBpZgotCSAqIHtAbGluayAjaXNPdXRPZkRhdGUoKX0gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgZm9yY2VVcGRhdGUgaXMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGEgcmVmcmVzaCBpcyBpbW1lZGlhdGVseSBtYWRlIHdpdGhvdXQgY2hlY2tpbmcKLQkgKiB7QGxpbmsgI2lzT3V0T2ZEYXRlKCl9LgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZVVwZGF0ZQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goYm9vbGVhbiBmb3JjZVVwZGF0ZSl7Ci0gICAgCWlmKGZvcmNlVXBkYXRlIHx8IGlzT3V0T2ZEYXRlKCkpewotICAgIAkJcmVmcmVzaCgpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZ2V0RGVjb3JhdGlvbnNNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNvcmF0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElWaXJ0dWFsUmVmZXJlbmNlIFtdIGNvbXB1dGVSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IHZjKXsKLSAgICAJcmV0dXJuIHZjLmdldFJlZmVyZW5jZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZUNsYXNzcGF0aEVudHJpZXMoKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgdmMgCi0gICAgICAgICAgICA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KCB0aGlzLnByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB2YyA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXB1dGVSZWZlcmVuY2VzKHZjKTsKLSAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG51bGw7Ci0gICAgICAgIFNldCBqYXJzSGFuZGxlZCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIFN0cmluZyBqYXJOYW1lID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb21wID0gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBpZiAoIXJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMocGF0aHNbMF0ubWFrZUFic29sdXRlKCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgamFyTmFtZSA9IHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKTsKLSAgICAgICAgICAgIGlmKG51bGwgIT0gamFyTmFtZSl7Ci0gICAgICAgICAgICAgICAgamFyc0hhbmRsZWQuYWRkKGphck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSVBhdGggbmV3UGF0aCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcC5pc0JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAJaWYoIGNvbXAgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCApCi0gICAgICAgICAgICAJCWNvbnRpbnVlOwotICAgICAgICAgICAgCW5ld1BhdGggPSAoSVBhdGgpY29tcC5nZXRBZGFwdGVyKElQYXRoLmNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIG5ld1BhdGggPSBjb21wLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpOyAgICAKLSAgICAgICAgICAgIAotICAgICAgICAJaWYoIG5ld1BhdGggIT0gbnVsbCAmJiAhZW50cmllcy5jb250YWlucyhuZXdQYXRoKSkKLSAgICAgICAgICAgICAgICBlbnRyaWVzLmFkZCggbmV3UGF0aCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHRoaXMucGF0aHMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdmMuZ2V0Um9vdEZvbGRlcigpOwotICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxGb2xkZXIgdmYgPSByb290Rm9sZGVyLmdldEZvbGRlciggcGF0aHNbIGkgXSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggdGhpcy5wYXRoVHlwZXNbIGkgXSA9PSBQYXRoVHlwZS5MSUJfRElSRUNUT1JZICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJVmlydHVhbFJlc291cmNlW10gY29udGVudHM7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA9IG1lbWJlcnMoIHZmICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBjb250ZW50cy5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2UgciA9IGNvbnRlbnRzWyBqIF0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHAgPSByLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZighamFyc0hhbmRsZWQuY29udGFpbnMocC5sYXN0U2VnbWVudCgpKSAmJiAgaXNKYXJGaWxlKCByICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXJzSGFuZGxlZC5hZGQocC5sYXN0U2VnbWVudCgpKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgCWVudHJpZXMuYWRkKCBwICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNvbnRhaW5lcltdIHVmID0gdmYuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IHVmLmxlbmd0aDsgaisrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHAgPSB1ZlsgaiBdLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggISBqYXJzSGFuZGxlZC5jb250YWlucyggcC5sYXN0U2VnbWVudCgpICkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAhIGlzU291cmNlT3JPdXRwdXREaXJlY3RvcnkoIHAgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphcnNIYW5kbGVkLmFkZChwLmxhc3RTZWdtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAJZW50cmllcy5hZGQoIHAgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbnRyaWVzOwotICAgIH0KLQotICAgIC8vIFRPRE86IFRoaXMgbWV0aG9kIHdhcyBjcmVhdGVkIHRvIHByb3ZpZGUgYSBzYWZlIGxhc3QtbWludXRlIHdvcmthcm91bmQKLSAgICAvLyBmb3IgdGhlIGlzc3VlIGRlc2NyaWJlZCBpbiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYyOTc0LgotICAgIC8vIFRoaXMgY29kZSBuZWVkcyB0byBiZSByZXZpc2l0ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZSB0byBmaW5kIGEgbW9yZQotICAgIC8vIHBlcm1hbmVudCBzb2x1dGlvbi4KLQotICAgIHByb3RlY3RlZCBJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyggZmluYWwgSVZpcnR1YWxGb2xkZXIgdmYgKSAKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZmLm1lbWJlcnMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgbmV3TGlicmFyeUVudHJ5KCBmaW5hbCBJUGF0aCBwICkKLSAgICB7Ci0gICAgICAgIElQYXRoIHNyY3BhdGggPSBudWxsOwotICAgICAgICBJUGF0aCBzcmNyb290cGF0aCA9IG51bGw7Ci0gICAgICAgIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRycyA9IHt9OwotICAgICAgICBJQWNjZXNzUnVsZVtdIGFjY2VzcyA9IHt9OwotICAgICAgICAKLSAgICAgICAgZmluYWwgQ2xhc3NwYXRoRGVjb3JhdGlvbnMgZGVjIAotICAgICAgICAgICAgPSBkZWNvcmF0aW9ucy5nZXREZWNvcmF0aW9ucyggZ2V0RGVjb3JhdGlvbk1hbmFnZXJLZXkocHJvamVjdCwgZ2V0UGF0aCgpLnRvU3RyaW5nKCkpLCBwLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBkZWMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNyY3BhdGggPSBkZWMuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKLSAgICAgICAgICAgIHNyY3Jvb3RwYXRoID0gZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOwotICAgICAgICAgICAgYXR0cnMgPSBkZWMuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoIHAsIHNyY3BhdGgsIHNyY3Jvb3RwYXRoLCBhY2Nlc3MsIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU291cmNlT3JPdXRwdXREaXJlY3RvcnkoIGZpbmFsIElQYXRoIGFQYXRoICkKLSAgICB7Ci0gICAgICAgIGlmKCBpc0phdmFQcm9qZWN0KCB0aGlzLnByb2plY3QgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSggdGhpcy5wcm9qZWN0ICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBqcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBjcFsgaSBdOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHNyYyA9IGNwZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBvdXRwdXQgPSBjcGUuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNyYy5lcXVhbHMoIGFQYXRoICkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgIT0gbnVsbCAmJiBvdXRwdXQuZXF1YWxzKCBhUGF0aCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZigganByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKS5lcXVhbHMoIGFQYXRoICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKYXZhUHJvamVjdCggZmluYWwgSVByb2plY3QgcGogKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwai5nZXROYXR1cmUoIEphdmFDb3JlLk5BVFVSRV9JRCApICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGbGV4aWJsZVByb2plY3QoIGZpbmFsIElQcm9qZWN0IHBqICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGouZ2V0TmF0dXJlKCBJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQgKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0phckZpbGUoIGZpbmFsIElSZXNvdXJjZSBmICkKLSAgICB7Ci0gICAgICAgIGlmKCBmLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmbmFtZSA9IGYuZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggZm5hbWUuZW5kc1dpdGgoICIuamFyIiApIHx8IGZuYW1lLmVuZHNXaXRoKCAiLnppcCIgKSApIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNZXRhZGF0YUZpbGUoIGZpbmFsIElSZXNvdXJjZSBmICkKLSAgICB7Ci0gICAgICAgIGlmKCBmLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmbmFtZSA9IGYuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiggZm5hbWUuZXF1YWxzKCAiLmNvbXBvbmVudCIgKSB8fCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZm5hbWUuZXF1YWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiICkgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZuYW1lLmVxdWFscyggIi5jbGFzc3BhdGgiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGbGV4aWJsZVByb2plY3RDb250YWluZXIoIGZpbmFsIElQYXRoIHBhdGggKQotICAgIHsKLSAgICAgICAgc3luY2hyb25pemVkKCBjb250YWluZXJUeXBlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb250YWluZXJUeXBlcy5jb250YWlucyggcGF0aC5zZWdtZW50KCAwICkgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZsZXhpYmxlUHJvamVjdENvbnRhaW5lclR5cGUoIGZpbmFsIFN0cmluZyB0eXBlICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggY29udGFpbmVyVHlwZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250YWluZXJUeXBlcy5hZGQoIHR5cGUgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMaXN0ZW5lcgotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICB3cy5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCBsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZCggZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTY3JlZW4gdGhlIGRlbHRhIGJlZm9yZSBnb2luZyBhbnkgZnVydGhlci4gCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCAhIGlzSW50ZXJlc3RpbmdFdmVudCggZXZlbnQgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBMb2NhdGUgYWxsIG9mIHRoZSBmbGV4aWJsZSBwcm9qZWN0IGNvbnRhaW5lcnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdCBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUHJvamVjdFtdIHByb2plY3RzIAotICAgICAgICAgICAgICAgID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbIGkgXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBpc0phdmFQcm9qZWN0KCBwcm9qZWN0ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUoIHByb2plY3QgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwZXMgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBjcGVzLmxlbmd0aDsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gY3Blc1sgaiBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHBhdGggPSBjcGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGbGV4aWJsZVByb2plY3RDb250YWluZXIoIHBhdGggKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKCBwYXRoLCBqcHJvaiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVycy5hZGQoIGNvbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBjb250YWluZXJzIHRoYXQgYXJlIG91dCBvZiBkYXRlLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gY29udGFpbmVycy5zaXplKCk7IGkgPCBuOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lciBjIAotICAgICAgICAgICAgICAgICAgICA9IChGbGV4aWJsZVByb2plY3RDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KCBpICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGMuaXNPdXRPZkRhdGUoIGRlbHRhICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYy5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZXN0aW5nRXZlbnQoIGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuWyAxIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoIGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhICkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2UgciA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHIuZ2V0VHlwZSgpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuUk9PVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLlBST0pFQ1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QoIChJUHJvamVjdCkgciApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2UuRk9MREVSOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBraW5kID09IElSZXNvdXJjZURlbHRhLkFEREVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbIDAgXSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5GSUxFOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpc0phckZpbGUoIHIgKSB8fCBpc01ldGFkYXRhRmlsZSggciApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsgMCBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBldmVudC5nZXREZWx0YSgpLmFjY2VwdCggdmlzaXRvciwgZmFsc2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiByZXN1bHRbIDAgXTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZWIxMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIgCi0KLSAgICBleHRlbmRzIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCi0KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZGVjb3JhdGlvbnMKLSAgICAgICAgPSBGbGV4aWJsZVByb2plY3RDb250YWluZXIuZ2V0RGVjb3JhdGlvbnNNYW5hZ2VyKCk7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKCBmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0KSAKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOyAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKCBmaW5hbCBJUGF0aCBjb250YWluZXJQYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBzZyApIAotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgCWZpbmFsIFN0cmluZyBrZXkgPSBGbGV4aWJsZVByb2plY3RDb250YWluZXIuZ2V0RGVjb3JhdGlvbk1hbmFnZXJLZXkocHJvamVjdC5nZXRQcm9qZWN0KCksIGNvbnRhaW5lclBhdGgudG9TdHJpbmcoKSk7Ci0gICAgCQotICAgIAlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gc2cuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotICAgICAgICAKLSAgICAgICAgZGVjb3JhdGlvbnMuY2xlYXJBbGxEZWNvcmF0aW9ucygga2V5ICk7Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzWyBpIF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIElQYXRoIHNyY3BhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotICAgICAgICAgICAgZmluYWwgSVBhdGggc3Jjcm9vdHBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRycyA9IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggc3JjcGF0aCAhPSBudWxsIHx8IGF0dHJzLmxlbmd0aCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlaWQgPSBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgPSBuZXcgQ2xhc3NwYXRoRGVjb3JhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFBhdGgoIHNyY3BhdGggKTsKLSAgICAgICAgICAgICAgICBkZWMuc2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCBzcmNyb290cGF0aCApOwotICAgICAgICAgICAgICAgIGRlYy5zZXRFeHRyYUF0dHJpYnV0ZXMoIGF0dHJzICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMuc2V0RGVjb3JhdGlvbnMoIGtleSwgZWlkLCBkZWMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZGVjb3JhdGlvbnMuc2F2ZSgpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIKLSAgICAgICAgICAgID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKCBjb250YWluZXJQYXRoLCBwcm9qZWN0ICk7Ci0gICAgICAgIAotICAgICAgICAoIChGbGV4aWJsZVByb2plY3RDb250YWluZXIpIGNvbnRhaW5lciApLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZWU2NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSmF2YUFydGlmYWN0RWRpdE1vZGVsIGV4dGVuZHMgQXJ0aWZhY3RFZGl0TW9kZWwgaW1wbGVtZW50cyBXb3JraW5nQ29weVByb3ZpZGVyIHsKLQotCXByaXZhdGUgV29ya2luZ0NvcHlNYW5hZ2VyIHdvcmtpbmdDb3B5TWFuYWdlciA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YUFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksCi0JCQlib29sZWFuIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIFVSSSBtb2R1bGVVUkksIFVSSSByb290VVJJLCBTdHJpbmcgcm9vdENvbnRlbnRUeXBlKSB7Ci0JCXN1cGVyKGFuRWRpdE1vZGVsSWQsIGNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LCBtb2R1bGVVUkksIHJvb3RVUkksIHJvb3RDb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIEphdmFBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgVVJJIG1vZHVsZVVSSSwgVVJJIHJvb3RVUkksCi0JCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlKSB7Ci0JCXN1cGVyKGVkaXRNb2RlbElELCBjb250ZXh0LCB0b01ha2VSZWFkT25seSwgbW9kdWxlVVJJLCByb290VVJJLCByb290Q29udGVudFR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogQHBhcmFtIGFDb250ZXh0Ci0JICogQHBhcmFtIHRvTWFrZVJlYWRPbmx5Ci0JICogQHBhcmFtIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqLwotCXB1YmxpYyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIGJvb2xlYW4gdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSwgVVJJIGFNb2R1bGVVUkkpIHsKLQkJc3VwZXIoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LAotCQkJCXRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIGFNb2R1bGVVUkkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbkVkaXRNb2RlbElkCi0JICogQHBhcmFtIGFDb250ZXh0Ci0JICogQHBhcmFtIHRvTWFrZVJlYWRPbmx5Ci0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKi8KLQlwdWJsaWMgSmF2YUFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBib29sZWFuIHRvTWFrZVJlYWRPbmx5LCBVUkkgYU1vZHVsZVVSSSkgewotCQlzdXBlcihhbkVkaXRNb2RlbElkLCBhQ29udGV4dCwgdG9NYWtlUmVhZE9ubHksIGFNb2R1bGVVUkkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBkZWxldGUKLQkgKiAKLQkgKiBAY3UgZnJvbSB0aGUgd29ya2JlbmNoIGFuZCBmaXggdGhlIGludGVybmFsIHJlZmVyZW5jZXMgZm9yIHRoaXMgd29ya2luZyBjb3B5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3UsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuZGVsZXRlKGN1LCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIEoyRUVOYXR1cmUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQlzdXBlci5kb0Rpc3Bvc2UoKTsKLQkJcmVzZXRXb3JraW5nQ29weU1hbmFnZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCWphdmEudXRpbC5TZXQgYWZmZWN0ZWQgPSBzdXBlci5nZXRBZmZlY3RlZEZpbGVzKCk7Ci0JCWlmIChnZXRXb3JraW5nQ29weU1hbmFnZXIoKSAhPSBudWxsKQotCQkJYWZmZWN0ZWQuYWRkQWxsKGdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmdldEFmZmVjdGVkRmlsZXMoKSk7Ci0JCi0JCXJldHVybiBhZmZlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuIERvZXMgbm90IGNvbm5lY3QgdGhlIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRFeGlzdGluZ1dvcmtpbmdDb3B5KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRFeGlzdGluZ1dvcmtpbmdDb3B5KGN1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmdldFdvcmtpbmdDb3B5KGN1LCBmb3JOZXdDVSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgbmV3IGNvbXBpbGF0aW9uIHVuaXRzIG9ubHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuc2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud29ya2JlbmNoLkoyRUVFZGl0TW9kZWwjaXNEaXJ0eSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJYm9vbGVhbiBkaXJ0eUJvb2wgPSBzdXBlci5pc0RpcnR5KCk7Ci0JCWlmICghZGlydHlCb29sICYmIGdldFdvcmtpbmdDb3B5TWFuYWdlcigpICE9IG51bGwpCi0JCQlkaXJ0eUJvb2wgPSBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5oYXNXb3JraW5nQ29waWVzKCk7Ci0JCXJldHVybiBkaXJ0eUJvb2w7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGZvcmNlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBSZXNvdXJjZXMgdG8gYmUgc2F2ZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbVNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNhdmVDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCQlpZiAobW9uaXRvciA9PSBudWxsIHx8ICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXN1cGVyLnByaW1TYXZlKG1vbml0b3IpOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBydW5TYXZlT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsLElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6MTQ6MjYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvY2Vzc1Jlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgIWdldFJlc291cmNlcygpLmNvbnRhaW5zKGFSZXNvdXJjZSkpIHsKLQkJCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBSZWZlcmVuY2VkUmVzb3VyY2UpIHsKLQkJCQlhY2Nlc3MoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJCQkvL1dlIG5lZWQgYSBiZXR0ZXIgd2F5IHRvIHBhc3MgdGhpcyB0aHJvdWdoIHRoZSBzYXZlIG9wdGlvbnMgaW5zdGVhZC4KLQkJCQkvL1dlIGFsc28gbmVlZCB0byBtYWtlIHRoaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgcHJvamVjdCB0YXJnZXQKLQkJCQkoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCX0gZWxzZSBpZiAoIWlzUmVhZE9ubHkoKSkKLQkJCQlhUmVzb3VyY2Uuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQlhZGRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQotCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaXNSZWZSZXMgPSBhUmVzb3VyY2UgaW5zdGFuY2VvZiBSZWZlcmVuY2VkUmVzb3VyY2U7Ci0JCQlpZiAoaXNSZWZSZXMpCi0JCQkJcmVsZWFzZSgoUmVmZXJlbmNlZFJlc291cmNlKSBhUmVzb3VyY2UpOwotCQkJZWxzZSBpZiAoIWlzUmVhZE9ubHkoKSkKLQkJCQlhUmVzb3VyY2Uuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQkJaWYgKCFpc0Rpc3Bvc2luZygpKQotCQkJCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JCQl9Ci0JCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud29ya2JlbmNoLkoyRUVFZGl0TW9kZWwjcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLAotCSAqICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZChSZXNvdXJjZSBhUmVzb3VyY2UsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJaWYgKCFpc1JldmVydGluZyAmJiAhZGlzcG9zaW5nICYmICFpc1JlYWRPbmx5KCkgJiYgb2xkVmFsdWUgJiYgIW5ld1ZhbHVlICYmIGFSZXNvdXJjZSBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkJCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JCXN1cGVyLnJlc291cmNlSXNMb2FkZWRDaGFuZ2VkKGFSZXNvdXJjZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZXZlcnRlZChSZWZlcmVuY2VkUmVzb3VyY2UgcmV2ZXJ0ZWRSZXNvdXJjZSkgewotCQlpZiAoZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLnJldmVydCgpOwotCQlyZXZlcnRBbGxSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuc2F2ZUNvbXBpbGF0aW9uVW5pdHMobW9uaXRvcik7Ci0JfQotCi0JcHVibGljIFdvcmtpbmdDb3B5TWFuYWdlciBnZXRXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCWlmICh3b3JraW5nQ29weU1hbmFnZXIgPT0gbnVsbCkKLQkJCXdvcmtpbmdDb3B5TWFuYWdlciA9IFdvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkubmV3UmVnaXN0ZXJlZEluc3RhbmNlKCk7Ci0JCXJldHVybiB3b3JraW5nQ29weU1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgdGhlIHdvcmtpbmcgY29weSBtYW5hZ2VyIGJlY2F1c2UgdGhlIGVqYi1qYXIueG1sIHdhcyByZW1vdmVkIHdpdGhvdXQgZGlzcG9zaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlpZiAod29ya2luZ0NvcHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXdvcmtpbmdDb3B5TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQl3b3JraW5nQ29weU1hbmFnZXIgPSBudWxsOwotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2NDBmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEphdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFZGl0TW9kZWxGYWN0b3J5IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRURJVF9NT0RFTF9JRCA9ICJvcmcuZWNsaXBzZS5qc3QubW9kdWxlY29yZS5lZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTU9EVUxFX1VSSSA9ICJNT0RVTEVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfVVJJID0gIlJPT1RfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFID0gIlJPT1RfQ09OVEVOVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpIDogbnVsbCk7Ci0JCVVSSSByb290VVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfVVJJKSA6IG51bGwpOwotCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlID0gKFN0cmluZykgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFKSA6IG51bGwpOwotCQlpZihtb2R1bGVVUkkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgTW9kdWxlIFVSSSBtdXN0IGJlIHByb3ZpZGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiAgbmV3IEphdmFBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgdHJ1ZSwgbW9kdWxlVVJJLHJvb3RVUkkscm9vdENvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJVVJJIG1vZHVsZVVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9NT0RVTEVfVVJJKSA6IG51bGwpOwotCQlVUkkgcm9vdFVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX1VSSSkgOiBudWxsKTsKLQkJU3RyaW5nIHJvb3RDb250ZW50VHlwZSA9IChTdHJpbmcpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX0NPTlRFTlRfVFlQRSkgOiBudWxsKTsKLQkJaWYobW9kdWxlVVJJID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBIE1vZHVsZSBVUkkgbXVzdCBiZSBwcm92aWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAgbmV3IEphdmFBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgZmFsc2UsZmFsc2UsIG1vZHVsZVVSSSxyb290VVJJLHJvb3RDb250ZW50VHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjZ2V0Q2FjaGVJRChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsgCi0JCVVSSSBtb2R1bGVVUkkgPSAoVVJJKXBhcmFtcy5nZXQoUEFSQU1fTU9EVUxFX1VSSSk7Ci0JCWlmKG1vZHVsZVVSSSAhPSBudWxsKQotCQkJcmV0dXJuIGVkaXRNb2RlbElEKyI6Iittb2R1bGVVUkkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZWRpdE1vZGVsSUQrIjpOT1VSSSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2U5OTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI7Ci0KLQotLyoqCi0gKiBKYXZhIFByb2plY3QgdmFsaWRhdGlvbiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIgewotCQotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25UeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNnZXRCYXNlVmFsaWRhdGlvblR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldEJhc2VWYWxpZGF0aW9uVHlwZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpCi0JCQlyZXR1cm4gKChJSmF2YVByb2plY3Qpc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKSB7Ci0JCXJldHVybiB2YWxpZGF0aW9uVHlwZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI3NldFZhbGlkYXRpb25UeXBlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoU3RyaW5nIHZhbGlkYXRpb25UeXBlKSB7Ci0JCXRoaXMudmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0aW9uVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9XVFBXb3JraW5nQ29weU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9XVFBXb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzZDE1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV1RQV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVyUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjcvMjAwMSA0OjE0OjMwIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBXb3JraW5nQ29weU1hbmFnZXIgaW1wbGVtZW50cyBXb3JraW5nQ29weU1hbmFnZXIgewotCi0JLy9OZXcgQ1VzIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgdXBvbiBkaXNwb3NlCi0JcHJpdmF0ZSBMaXN0IG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0czsKLQkvL05ldyBDVXMgdGhhdCB3ZXJlIGNyZWF0ZWQgdGhhdCBuZWVkIHNhdmVkIGltbWVkaWF0ZWx5IChhZnRlciBlYWNoIGdlbikKLQlwcml2YXRlIExpc3QgbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzOwotCS8vQSBjb21wbGV0ZSBsaXN0IG9mIG5ldyBDVXMgdGhhdCBpcyBvbmx5IGNsZWFyZWQgb24gc2F2ZSBhbmQgZGlzcG9zZQotCXByaXZhdGUgTGlzdCBuZXdDb21waWxhdGlvblVuaXRzOwotCXByaXZhdGUgSGFzaE1hcCBkZWxldGVkQ29tcGlsYXRpb25Vbml0czsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQotCS8qKgotCSAqIFdUUFdvcmtpbmdDb3B5TWFuYWdlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXVFBXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpLnJlbW92ZShjdSk7Ci0JCWlmICghZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoY3UpICYmICFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCXByaW1BZGREZWxldGVkQ29tcGlsYXRpb25Vbml0KGN1KTsKLQkJZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkucmVtb3ZlKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXdDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSkgewotCQlnZXROZXdDb21waWxhdGlvblVuaXRzKCkuYWRkKGN1KTsKLQkJZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCkuYWRkKHdvcmtpbmdDb3B5KTsKLQkJaWYgKCFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCWdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmFkZChjdSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IHdjLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJd2MuY29tbWl0V29ya2luZ0NvcHkoZmFsc2UsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGUpICYmIHNob3VsZFNhdmVSZWFkT25seSh3YykpCi0JCQkJCXdjLmNvbW1pdFdvcmtpbmdDb3B5KGZhbHNlLCBtb25pdG9yKTsKLQkJCQllbHNlCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXdjLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZQotCSAqIAotCSAqIEBjdSBmcm9tIHRoZSB3b3JrYmVuY2ggYW5kIGZpeCB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBmb3IgdGhpcyB3b3JraW5nIGNvcHkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgbG9jYWxDVSA9IGN1OwotCQlpZiAobG9jYWxDVS5pc1dvcmtpbmdDb3B5KCkpCi0JCQlsb2NhbENVID0gbG9jYWxDVS5nZXRQcmltYXJ5KCk7Ci0JCWFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQobG9jYWxDVSk7Ci0JCXRyeSB7Ci0JCQlsb2NhbENVLmRlbGV0ZShmYWxzZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5FTEVNRU5UX0RPRVNfTk9UX0VYSVNUKQotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkT3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAoZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlMaXN0IGN1cyA9IGdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1OwotCQlJQ29tcGlsYXRpb25Vbml0IHdjID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXMuc2l6ZSgpOyBpKyspIHsKLQkJCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGN1cy5nZXQoaSk7Ci0JCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKSB7Ci0JCQkJd2MgPSBjdTsKLQkJCQljdSA9IHdjLmdldFByaW1hcnkoKTsKLQkJCX0KLQkJCXByaW1EZWxldGUoY3UpOwotCQkJaWYgKHdjICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJd2MuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQkJCXByaW1EaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlpZiAoIVdUUENvbW1vblBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc1RyZWVMb2NrZWQoKSkgewotCQkJCVdUUENvbW1vblBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsbnVsbCwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bm5hYmxlLnJ1bihudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25GcmFtZXdvcmtzUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJ0KCkgewotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQlwcmltUmV2ZXJ0KCk7Ci0JCQl9Ci0JCX07Ci0JCXJ1bk9wZXJhdGlvbihydW5uYWJsZSwgbnVsbCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTEvMjAwMSA2OjQzOjM3IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcCBnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKGRlbGV0ZWRDb21waWxhdGlvblVuaXRzID09IG51bGwpCi0JCQlkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBkZWxldGVkQ29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuIERvZXMgbm90IGNvbm5lY3QgdGhlIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRFeGlzdGluZ1dvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVSA9IGdldE5ld0NvbXBpbGF0aW9uVW5pdFdvcmtpbmdDb3B5KGN1KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDcvMTkvMjAwMSAxMTowMDoxOSBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKG5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjYvMjAwMSAzOjQ5OjA1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0TmV3Q29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKG5ld0NvbXBpbGF0aW9uVW5pdHMgPT0gbnVsbCkKLQkJCW5ld0NvbXBpbGF0aW9uVW5pdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBuZXdDb21waWxhdGlvblVuaXRzOwotCX0KLQotCS8qKgotCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgdGhpcyBDb21waWxhdGlvblVuaXQgYW5kIGl0cyB3b3JraW5nIGNvcHkuIElmCi0JICogdGhpcyBpcyB0aGUgY2FzZSwgcmV0dXJuIG91ciBuZXcgd29ya2luZyBjb3B5IGFuZCBkbyBub3QgY3JlYXRlIGEgbmV3IG9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBnZXROZXdDb21waWxhdGlvblVuaXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChoYXNOZXdDb21waWxhdGlvblVuaXQoY3UpKSB7Ci0JCQlMaXN0IGxpc3QgPSBnZXROZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMoKTsKLQkJCUlDb21waWxhdGlvblVuaXQgY29weTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCWNvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCkgbGlzdC5nZXQoaSk7Ci0JCQkJaWYgKGN1LmVxdWFscyhjb3B5LmdldFByaW1hcnkoKSkpCi0JCQkJCXJldHVybiBjb3B5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjYvMjAwMSAzOjQ5OjA1IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkgewotCQlpZiAob3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID09IG51bGwpCi0JCQlvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJUGFja2FnZUZyYWdtZW50IGZvciB0aGUgZ2l2ZW4gSUNvbXBpbGF0aW9uVW5pdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJSmF2YUVsZW1lbnQgcGFyZW50ID0gY3U7Ci0JCWludCBlbGVtZW50VHlwZSA9IGN1LmdldEVsZW1lbnRUeXBlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBlbGVtZW50VHlwZSAhPSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgewotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCWVsZW1lbnRUeXBlID0gcGFyZW50LmdldEVsZW1lbnRUeXBlKCk7Ci0JCQllbHNlCi0JCQkJZWxlbWVudFR5cGUgPSAtMTsKLQkJfQotCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpIHBhcmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVNhdmVIYW5kbGVyIGdldFNhdmVIYW5kbGVyKCkgewotCQlyZXR1cm4gU2F2ZUhhbmRsZXJSZWdpc3Rlci5nZXRTYXZlSGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSwgYm9vbGVhbiBmb3JOZXdDVSkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKLQkJaWYgKGN1ID09IG51bGwgfHwgY3UuaXNXb3JraW5nQ29weSgpKQotCQkJcmV0dXJuIGN1OwotCQlJQ29tcGlsYXRpb25Vbml0IG5ld0NVID0gZ2V0TmV3Q29tcGlsYXRpb25Vbml0V29ya2luZ0NvcHkoY3UpOwotCQlpZiAobmV3Q1UgIT0gbnVsbCkKLQkJCXJldHVybiBuZXdDVTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSA9IGN1LmdldFdvcmtpbmdDb3B5KG51bGwpOwotCQlhZGROZXdDb21waWxhdGlvblVuaXQoY3UsIHdvcmtpbmdDb3B5KTsKLQkJcmV0dXJuIHdvcmtpbmdDb3B5OwotCX0KLQotCS8qKgotCSAqIEhhcyBhIG5ldyBjb21waWxhdGlvbiB1bml0IGFscmVhZHkgYmVlbiBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05ld0NvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBnZXROZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoY3UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShFeGNlcHRpb24gZXgpIHsKLQkJcmV0dXJuIFNhdmVIYW5kbGVySGVhZGxlc3MuaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltQWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChjdSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlPYmplY3RbXSBpbmZvID0gbmV3IE9iamVjdFsyXTsKLQkJaW5mb1swXSA9IGdldFBhY2thZ2VGcmFnbWVudChjdSk7Ci0JCXRyeSB7Ci0JCQlpbmZvWzFdID0gY3UuZ2V0U291cmNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlpbmZvWzFdID0gbnVsbDsKLQkJfQotCQlnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLnB1dChjdSwgaW5mbyk7Ci0JfQotCi0JLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBkZWxldGUgY2FsbC4KLQlwcm90ZWN0ZWQgdm9pZCBwcmltRGVsZXRlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJdHJ5IHsKLQkJCWlmIChjdS5leGlzdHMoKSkKLQkJCQljdS5kZWxldGUodHJ1ZSwgbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCS8vV2hhdCB0byBkbyBoZXJlPwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbURpc3Bvc2UoKSB7Ci0JCWRpc2NhcmRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKTsKLQkJcmV2aXZlRGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKTsKLQkJbmV3Q29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JCW5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JCW9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JCWRlbGV0ZWRDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmV2ZXJ0KCkgewotCQlkaXNjYXJkT3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCk7Ci0JCXJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXRzKCk7Ci0JCW5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQluZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdAotCSAqIEByZXR1cm4gdGhlIHdvcmtpbmcgY29weSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlucHV0IGRvZXMKLQkgKiAgICAgICAgIG5vdCBlbmNvZGUgYW4gZWRpdG9yIGlucHV0LCBvciBpZiB0aGVyZSBpcyBubyByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcwotCSAqICAgICAgICAgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IHByaW1HZXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1TYXZlQ29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNhdmVOZXdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCQlnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdCBjdXMgPSBnZXROZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB3YzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXMuc2l6ZSgpOyBpKyspIHsKLQkJCXdjID0gKElDb21waWxhdGlvblVuaXQpIGN1cy5nZXQoaSk7Ci0JCQljb21taXRXb3JraW5nQ29weSh3YywgbW9uaXRvcik7Ci0JCX0KLQkJY3VzLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLnJlbW92ZShjdSkgIT0gbnVsbCkgewotCQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkgewotCQkJCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWwsIG5leHRDVSwgdGVzdENVOwotCQkJCW9yaWdpbmFsID0gY3UuZ2V0UHJpbWFyeSgpOwotCQkJCVNldCBjdXMgPSBnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmtleVNldCgpOwotCQkJCUl0ZXJhdG9yIGl0ID0gY3VzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQluZXh0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgaXQubmV4dCgpOwotCQkJCQl0ZXN0Q1UgPSBuZXh0Q1UuaXNXb3JraW5nQ29weSgpID8gKElDb21waWxhdGlvblVuaXQpIG5leHRDVS5nZXRQcmltYXJ5KCkgOiBuZXh0Q1U7Ci0JCQkJCWlmICh0ZXN0Q1UuZXF1YWxzKG9yaWdpbmFsKSkgewotCQkJCQkJY3VzLnJlbW92ZShuZXh0Q1UpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmV2aXZlRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1LCBPYmplY3RbXSBpbmZvLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCWlmKGN1LmdldEphdmFQcm9qZWN0KCkuaXNPcGVuKCkpIHsKLQkJCWlmIChpbmZvWzBdICE9IG51bGwgJiYgaW5mb1sxXSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gY3UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSAoSVBhY2thZ2VGcmFnbWVudCkgaW5mb1swXTsKLQkJCQlTdHJpbmcgc291cmNlID0gKFN0cmluZykgaW5mb1sxXTsKLQkJCQl0cnkgewotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGV4aXN0aW5nQ1UgPSBwYWNrLmdldENvbXBpbGF0aW9uVW5pdCh0eXBlTmFtZSk7Ci0JCQkJCWlmIChleGlzdGluZ0NVLmV4aXN0cygpICYmIGdldE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5jb250YWlucyhleGlzdGluZ0NVKSkKLQkJCQkJCWV4aXN0aW5nQ1UuZGVsZXRlKGZhbHNlLCBwbSk7Ci0JCQkJCXBhY2suY3JlYXRlQ29tcGlsYXRpb25Vbml0KHR5cGVOYW1lLCBzb3VyY2UsIGZhbHNlLCBwbSk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZpdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKGdldERlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQkKLQkJSVByb2dyZXNzTW9uaXRvciBwbSA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlJdGVyYXRvciBpdCA9IGdldERlbGV0ZWRDb21waWxhdGlvblVuaXRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U7Ci0JCU9iamVjdFtdIGluZm87Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQlpbmZvID0gKE9iamVjdFtdKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJcmV2aXZlRGVsZXRlZENvbXBpbGF0aW9uVW5pdChjdSwgaW5mbywgcG0pOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5PcGVyYXRpb24oSVdvcmtzcGFjZVJ1bm5hYmxlIGFSdW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIHZhbGlkYXRlKSB7Ci0JCXByaW1SdW5PcGVyYXRpb24oYVJ1bm5hYmxlLCBtb25pdG9yKTsKLQotCQkvLyBUT0RPIEJyZWFrIHRoZSB2YWxpZGF0b3IgZGVwZWRlbmN5Ci0JCS8vCWlmICh2YWxpZGF0ZSkKLQkJLy8JCXByaW1SdW5PcGVyYXRpb24oYVJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJLy8JZWxzZSB7Ci0JCS8vCQlJUHJvamVjdCBwcm9qID0gZ2V0VmFsaWRhdGlvblByb2plY3QoKTsKLQkJLy8JCQkKLQkJLy8JCVZhbGlkYXRvck1hbmFnZXIgbWdyID0gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0JCS8vCQlib29sZWFuIGRpc2FibGVWYWxpZGF0b3JzID0gcHJvaiAhPSBudWxsOwotCQkvLwkJYm9vbGVhbiB3YXNTdXNwZW5kZWQgPSBmYWxzZTsKLQkJLy8JCWlmIChkaXNhYmxlVmFsaWRhdG9ycykgewotCQkvLwkJCXdhc1N1c3BlbmRlZCA9IG1nci5pc1N1c3BlbmRlZChwcm9qKTsKLQkJLy8JCQlpZiAoIXdhc1N1c3BlbmRlZCkKLQkJLy8JCQkJbWdyLnN1c3BlbmRWYWxpZGF0aW9uKHByb2osIHRydWUpOwotCQkvLwkJfQotCQkvLwkJdHJ5IHsKLQkJLy8JCQlwcmltUnVuT3BlcmF0aW9uKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCS8vCQl9IGZpbmFsbHkgewotCQkvLwkJCWlmIChkaXNhYmxlVmFsaWRhdG9ycyAmJiAhd2FzU3VzcGVuZGVkKQotCQkvLwkJCQltZ3Iuc3VzcGVuZFZhbGlkYXRpb24ocHJvaiwgZmFsc2UpOwotCQkvLwkJfQotCQkvLwl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bk9wZXJhdGlvbihJV29ya3NwYWNlUnVubmFibGUgYVJ1bm5hYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCWlmIChhUnVubmFibGUgIT0gbnVsbCkgewotCQkJLy9pZiAod29ya3NwYWNlLmlzVHJlZUxvY2tlZCgpKQotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nVHJhY2UoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2Fubm90X3J1bl9KMkVFVUlXb3JraW5nQ29fRVJST1JfIikpOwotCQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJDYW5ub3QgcnVuIEoyRUVVSVdvcmtpbmdDb3B5TWFuYWdlciBvcGVyYXRpb24gYmVjYXVzZSB0aGUgV29ya3NwYWNlCi0JCQkvLyB0cmVlIGlzIGxvY2tlZC4iCi0JCQkvL2Vsc2UgewotCQkJaWYgKCFXVFBDb21tb25QbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkpIHsKLQkJCQl0cnkgewotCQkJCQlXVFBDb21tb25QbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDb21waWxhdGlvblVuaXRzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0U2F2ZUhhbmRsZXIoKS5hY2Nlc3MoKTsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQkJcHJpbVNhdmVDb21waWxhdGlvblVuaXRzKGFNb25pdG9yKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVuT3BlcmF0aW9uKHJ1bm5hYmxlLCBtb25pdG9yLCB0cnVlKTsKLQkJfSBjYXRjaCAoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5oYW5kbGVTYXZlRmFpbGVkKGV4LCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFNhdmVIYW5kbGVyKCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSByZWZlcmVuY2VkIENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU5ld0NvbXBpbGF0aW9uVW5pdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXByaW1TYXZlT25seU5ld0NvbXBpbGF0aW9uVW5pdHMobW9uaXRvcik7Ci0JCWdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmNsZWFyKCk7Ci0JCWdldE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgbmV3IENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0U2F2ZUhhbmRsZXIoKS5hY2Nlc3MoKTsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQkJcHJpbVNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhhTW9uaXRvcik7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9wZXJhdGlvbihydW5uYWJsZSwgbW9uaXRvciwgZmFsc2UpOwotCQl9IGNhdGNoIChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlnZXRTYXZlSGFuZGxlcigpLmhhbmRsZVNhdmVGYWlsZWQoZXgsIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlUmVhZE9ubHkoSUNvbXBpbGF0aW9uVW5pdCB3YykgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0JCXJlc291cmNlID0gKElSZXNvdXJjZSkgd2MuZ2V0UHJpbWFyeSgpLmdldEFkYXB0ZXIoSVJFU09VUkNFX0NMQVNTKTsKLQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgfHwgIXJlc291cmNlLmdldFJlc291cmNlQXR0cmlidXRlcygpLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZ2V0U2F2ZUhhbmRsZXIoKS5zaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUoKElGaWxlKSByZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5JSjJFRVdvcmtpbmdDb3B5TWFuYWdlciNoYXNXb3JraW5nQ29waWVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNXb3JraW5nQ29waWVzKCkgewotCQlyZXR1cm4gKGRlbGV0ZWRDb21waWxhdGlvblVuaXRzICE9IG51bGwgJiYgIWRlbGV0ZWRDb21waWxhdGlvblVuaXRzLmlzRW1wdHkoKSkgfHwgKG5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cyAhPSBudWxsICYmICFuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMuaXNFbXB0eSgpKSB8fCAobmV3Q29tcGlsYXRpb25Vbml0cyAhPSBudWxsICYmICFuZXdDb21waWxhdGlvblVuaXRzLmlzRW1wdHkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2NjODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtpbmdDb3B5TWFuYWdlciBleHRlbmRzIFdvcmtpbmdDb3B5UHJvdmlkZXIgewotCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLQlqYXZhLnV0aWwuU2V0IGdldEFmZmVjdGVkRmlsZXMoKTsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXZvaWQgc2F2ZUNvbXBpbGF0aW9uVW5pdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgbmV3IENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0Jdm9pZCBzYXZlT25seU5ld0NvbXBpbGF0aW9uVW5pdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIE1ldGhvZCBoYXNXb3JraW5nQ29waWVzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzV29ya2luZ0NvcGllcygpOwotCi0JLyoqCi0JICogUmV2ZXJ0IGFsbCB3b3JraW5nIGNvcGllcy4KLQkgKi8KLQl2b2lkIHJldmVydCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTNmOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5IHsKLQotCS8vCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3Mgd29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3M7Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtpbmdDb3B5TWFuYWdlciBuZXdSZWdpc3RlcmVkSW5zdGFuY2UoKSB7Ci0JCXJldHVybiAoV29ya2luZ0NvcHlNYW5hZ2VyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCJ3b3JraW5nQ29weU1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vCXB1YmxpYyBzdGF0aWMgSVdvcmtpbmdDb3B5TWFuYWdlciBjcmVhdGVXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JLy8JCWlmIChnZXRXb3JraW5nQ29weU1hbmFnZXJDbGFzcygpICE9IG51bGwpCi0JLy8JCQl0cnkgewotCS8vCQkJCXJldHVybiAoSVdvcmtpbmdDb3B5TWFuYWdlcikgZ2V0V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MoKS5uZXdJbnN0YW5jZSgpOwotCS8vCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlMSkgewotCS8vCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotCS8vCQkJfQotCS8vCQlyZXR1cm4gbnVsbDsKLQkvLwl9Ci0JLy8JCi0JLy8JLyoqCi0JLy8JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCS8vCSAqIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgNzo1MzoxNSBBTSkKLQkvLwkgKiBAcmV0dXJuIGphdmEubGFuZy5DbGFzcwotCS8vCSAqLwotCS8vCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLkNsYXNzIGdldFdvcmtpbmdDb3B5TWFuYWdlckNsYXNzKCkgewotCS8vCQlyZXR1cm4gd29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3M7Ci0JLy8JfQotCS8vCQotCS8vCS8qKgotCS8vCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkvLwkgKiBDcmVhdGlvbiBkYXRlOiAoNC8yNi8yMDAxIDc6NTM6MTUgQU0pCi0JLy8JICogQHBhcmFtIG5ld1dvcmtpbmdDb3B5TWFuYWdlckNsYXNzIGphdmEubGFuZy5DbGFzcwotCS8vCSAqLwotCS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JraW5nQ29weU1hbmFnZXJDbGFzcyhqYXZhLmxhbmcuQ2xhc3MgbmV3V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MpIHsKLQkvLwkJd29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MgPSBuZXdXb3JraW5nQ29weU1hbmFnZXJDbGFzczsKLQkvLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk2ZjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotCi0KLS8qKgotICogVGhlIHVzZXIgb2YgdGhlIEphdmEgY29kZSBnZW5lcmF0aW9uIGZyYW1ld29yayBtdXN0IHN1cHBseSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KLSAqIFRoZSBmcmFtZXdvcmsgd2lsbCBvYnRhaW4gY29tcGlsYXRpb24gd29ya2luZyBjb3BpZXMgZnJvbSB0aGlzIGludGVyZmFjZS4gVGhlIHN1cHBsaWVyIG9mIHRoZQotICogaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGNvbW1pdHRpbmcgdGhlIHdvcmtpbmcgY29waWVzIHdoZW4gYXBwcm9wcmlhdGUgZm9yIHRoZSB1c2VyJ3MKLSAqIGVkaXQgbW9kZWwuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ0NvcHlQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgZGVsZXRlIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSB0aGUgd29ya2JlbmNoIGFuZCBmaXggdGhlIGludGVybmFsIHJlZmVyZW5jZXMgZm9yIHRoaXMKLQkgKiB3b3JraW5nIGNvcHkgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gY3UKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0IHRvIGRlbGV0ZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UgZm9yIHRoZSBkZWxldGUKLQkgKi8KLQl2b2lkIGRlbGV0ZShJQ29tcGlsYXRpb25Vbml0IGN1LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LiBUaGF0IGlzLCB0aGUgbWFuYWdlciBhbHJlYWR5Ci0JICogaGFzIGEgd29ya2luZyBjb3B5IGZvciB0aGlzIHVuaXQsIGl0IGRvZXMgbm90IGNyZWF0ZSBhIG5ldyB3b3JraW5nIGNvcHkuIERvZXMgbm90IGNvbm5lY3QgdGhlCi0JICogZWRpdCBtb2RlbCB0byB0aGUgd29ya2luZyBjb3B5LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGl0IHRoZXJlIGlzIG5vCi0JICogICAgICAgICByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JSUNvbXBpbGF0aW9uVW5pdCBnZXRFeGlzdGluZ1dvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IG9yIGNyZWF0ZXMgYSBuZXcgd29ya2luZyBjb3B5Ci0JICogZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGFuZCByZXR1cm5zIGl0LiBJZiBhIHdvcmtpbmcgY29weSBpcyBwYXNzZWQgaW4sIGl0IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgd29ya2luZyBjb3B5IGNhbiBub3QgYmUgY3JlYXRlZAotCSAqLwotCUlDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSwgYm9vbGVhbiBmb3JOZXdDVSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0lKYXZhUHJvamVjdExpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9JSmF2YVByb2plY3RMaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDBhZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0lKYXZhUHJvamVjdExpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLQotLyoqCi0gKiA8cD4KLSAqIFJlcHJlc2VudHMgYSBzY2FsZWQgZG93biB2ZXJzaW9uIG9mIGFuIHtAbGluayBJSmF2YVByb2plY3R9LiBUaGlzIHN1YnNldCBvZgotICogbWV0aG9kcyBpcyBndWFyYW50ZWVkIHRvIG5vdCBmb3JjZSBhIGxvYWQgb2YgdGhlIHVuZGVybHlpbmcKLSAqIHtAbGluayBJSmF2YU1vZGVsfS4gVGhpcyBlbmFibGVzIHNhZmUgYWNjZXNzIHRvIGEgbGltaXRlZCBzZXQgb2YKLSAqIHtAbGluayBJSmF2YVByb2plY3R9IEFQSSBmb3IgbXVsdGktdGhyZWFkZWQgY2xpZW50cyB0byBjYWxsIGR1cmluZyB0aW1lcyBvZgotICogZXh0cmVtZSBjb25jdXJyZW5jeSwgZS5nLiB3b3JrYmVuY2ggc3RhcnR1cC4KLSAqIDwvcD4KLSAqIDxwPgotICogQW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZXNlIGhhbmRsZXMgY2FuIGJlIGNyZWF0ZWQgdmlhCi0gKiA8Y29kZT5KYXZhQ29yZUxpdGUuY3JlYXRlKHByb2plY3QpPC9jb2RlPi4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBKYXZhQ29yZSNjcmVhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0gKiBAc2VlIElKYXZhUHJvamVjdAotICogQHNlZSBJQ2xhc3NwYXRoRW50cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVByb2plY3RMaXRlIHsKLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdCNyZWFkUmF3Q2xhc3NwYXRoKCkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSUNsYXNzcGF0aEVudHJ5W10gcmVhZFJhd0NsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3QjcmVhZE91dHB1dExvY2F0aW9uKCkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVBhdGggcmVhZE91dHB1dExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdCNnZXRQcm9qZWN0KCkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3QjZXhpc3RzKCkKLQkgKi8KLQlib29sZWFuIGV4aXN0cygpOwotCQotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0I2lzT3BlbigpCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNPcGVuKCk7Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdCNoYXNCdWlsZFN0YXRlKCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQnVpbGRTdGF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFDb3JlTGl0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFDb3JlTGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlhYTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9KYXZhQ29yZUxpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFjY2Vzc1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUNvcmVMaXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BVFVSRV9JRCA9IEphdmFDb3JlLk5BVFVSRV9JRDsKLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YUNvcmVMaXRlIElOU1RBTkNFID0gbnVsbDsKLQotCXByaXZhdGUgY2xhc3MgSmF2YUNvcmVMaXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoaWxkcmVuID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXByb2Nlc3NEZWx0YShjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCQlpbnQgZmxhZ3MgPSBkZWx0YS5nZXRGbGFncygpOwotCQkJaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xPU0VEKSAhPSAwKSB7Ci0JCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgZWxlbWVudDsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQlpbml0aWFsaXplZEphdmFQcm9qZWN0cy5yZW1vdmUocHJvamVjdCk7Ci0JCQkJCWphdmFQcm9qZWN0TGl0ZUNhY2hlLnJlbW92ZShwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKLQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgZWxlbWVudDsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCQlpZiAoIWluaXRpYWxpemVkSmF2YVByb2plY3RzLmNvbnRhaW5zKHByb2plY3QpICYmIGphdmFQcm9qZWN0TGl0ZUNhY2hlLmNvbnRhaW5zS2V5KHByb2plY3QpKSB7Ci0JCQkJCQkJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSA9IGphdmFQcm9qZWN0TGl0ZUNhY2hlLmdldChwcm9qZWN0KTsKLQkJCQkJCQlqYXZhUHJvamVjdExpdGUuZmx1c2hDbGFzc3BhdGgoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkgewotCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBlbGVtZW50OwotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJCWlmICghaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMuY29udGFpbnMocHJvamVjdCkpIHsKLQkJCQkJCQlpbml0aWFsaXplZEphdmFQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCQkJaWYgKGphdmFQcm9qZWN0TGl0ZUNhY2hlLmNvbnRhaW5zS2V5KHByb2plY3QpKSB7Ci0JCQkJCQkJCUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUgPSBqYXZhUHJvamVjdExpdGVDYWNoZS5nZXQocHJvamVjdCk7Ci0JCQkJCQkJCWphdmFQcm9qZWN0TGl0ZS5tYXJrSmF2YVByb2plY3RJbml0aWFsaXplZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFOgotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFOgotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGV2ZW50LmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCQlpbml0aWFsaXplZEphdmFQcm9qZWN0cy5yZW1vdmUocHJvamVjdCk7Ci0JCQkJCQlqYXZhUHJvamVjdExpdGVDYWNoZS5yZW1vdmUocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNldDxJUHJvamVjdD4gaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oKTsKLQlwcml2YXRlIE1hcDxJUHJvamVjdCwgSmF2YVByb2plY3RMaXRlPiBqYXZhUHJvamVjdExpdGVDYWNoZSA9IG5ldyBIYXNoTWFwPElQcm9qZWN0LCBKYXZhUHJvamVjdExpdGU+KCk7Ci0JcHJpdmF0ZSBKYXZhQ29yZUxpdGVMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhQ29yZUxpdGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCQlJTlNUQU5DRSA9IG5ldyBKYXZhQ29yZUxpdGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhQ29yZUxpdGUoKSB7Ci0JCWxpc3RlbmVyID0gbmV3IEphdmFDb3JlTGl0ZUxpc3RlbmVyKCk7Ci0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSk7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3RMaXRlIGNyZWF0ZUltcGwoSVByb2plY3QgcHJvamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCWlmIChqYXZhUHJvamVjdExpdGVDYWNoZS5jb250YWluc0tleShwcm9qZWN0KSkgewotCQkJCXJldHVybiBqYXZhUHJvamVjdExpdGVDYWNoZS5nZXQocHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGphdmFQcm9qZWN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCWphdmFQcm9qZWN0SW5pdGlhbGl6ZWQgPSBpbml0aWFsaXplZEphdmFQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KTsKLQkJCX0KLQkJCWlmICghamF2YVByb2plY3RJbml0aWFsaXplZCkgewotCQkJCWlmIChpc0luaXRpYWxpemVkKGphdmFQcm9qZWN0KSkgewotCQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJCWluaXRpYWxpemVkSmF2YVByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJfQotCQkJCQlqYXZhUHJvamVjdEluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlID0gbmV3IEphdmFQcm9qZWN0TGl0ZShqYXZhUHJvamVjdCwgamF2YVByb2plY3RJbml0aWFsaXplZCk7Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQlqYXZhUHJvamVjdExpdGVDYWNoZS5wdXQocHJvamVjdCwgamF2YVByb2plY3RMaXRlKTsKLQkJCX0KLQkJCXJldHVybiBqYXZhUHJvamVjdExpdGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlKYXZhTW9kZWxNYW5hZ2VyLlBlclByb2plY3RJbmZvIHByb2plY3RJbmZvID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0UGVyUHJvamVjdEluZm8oamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLCBmYWxzZSk7Ci0JCQlpZiAocHJvamVjdEluZm8gIT0gbnVsbCkgewotCQkJCWlmIChwcm9qZWN0SW5mby5nZXRSZXNvbHZlZENsYXNzcGF0aCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElKYXZhUHJvamVjdExpdGUgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuY3JlYXRlSW1wbChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElKYXZhUHJvamVjdExpdGUgY3JlYXRlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoU3RyaW5nIGNvbnRhaW5lcklEKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcihjb250YWluZXJJRCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3UHJvamVjdEVudHJ5KElQYXRoIHBhdGgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdQcm9qZWN0RW50cnkoSVBhdGggcGF0aCwgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgaXNFeHBvcnRlZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3UHJvamVjdEVudHJ5KElQYXRoIHBhdGgsIElBY2Nlc3NSdWxlW10gYWNjZXNzUnVsZXMsIGJvb2xlYW4gY29tYmluZUFjY2Vzc1J1bGVzLCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzLCBib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoLCBhY2Nlc3NSdWxlcywgY29tYmluZUFjY2Vzc1J1bGVzLCBleHRyYUF0dHJpYnV0ZXMsIGlzRXhwb3J0ZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeShJUGF0aCBwYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCwgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgc291cmNlQXR0YWNobWVudFBhdGgsIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3TGlicmFyeUVudHJ5KElQYXRoIHBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsIGlzRXhwb3J0ZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeShJUGF0aCBwYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCwgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoLCBJQWNjZXNzUnVsZVtdIGFjY2Vzc1J1bGVzLCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzLCBib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBzb3VyY2VBdHRhY2htZW50UGF0aCwgc291cmNlQXR0YWNobWVudFJvb3RQYXRoLCBhY2Nlc3NSdWxlcywgZXh0cmFBdHRyaWJ1dGVzLCBpc0V4cG9ydGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YUxpdGVVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9KYXZhTGl0ZVV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFlZGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9KYXZhTGl0ZVV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUxpdGVVdGlsaXRpZXMgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBzb3VyY2UgKGkuZS4gd2hlcmUgdGhlIC5qYXZhIGZpbGVzIGFyZSkgSUNvbnRhaW5lcnMgZm9yCi0JICogdGhlIHNwZWNpZmllZCBJSmF2YVByb2plY3RMaXRlCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0TGl0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YVNvdXJjZUNvbnRhaW5lcnMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUpIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCUxpc3Q8SUNvbnRhaW5lcj4gY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbnRhaW5lcj4oKTsKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgJiYgZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkJCQlpZiggZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnRDb3VudCgpID09IDEgKQotCQkJCQljb250YWluZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZW50cnkuZ2V0UGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCWVsc2UKLQkJCQkJY29udGFpbmVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQlpZiggIWNvbnRhaW5lcnMuY29udGFpbnMoY29udGFpbmVyKSkKLQkJCQkJY29udGFpbmVycy5hZGQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHNvdXJjZSAoaS5lLiB3aGVyZSB0aGUgY29tcGlsZWQgLmNsYXNzIGZpbGVzIGFyZSkgSUNvbnRhaW5lcnMgZm9yCi0JICogdGhlIHNwZWNpZmllZCBJSmF2YVByb2plY3RMaXRlCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0TGl0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YU91dHB1dENvbnRhaW5lcnMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUpIHsKLQkJTGlzdDxJQ29udGFpbmVyPiBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdDxJQ29udGFpbmVyPigpOwotCQlJQ29udGFpbmVyIGRlZmF1bHRPdXRwdXRDb250YWluZXIgPSBnZXREZWZhdWx0SmF2YU91dHB1dENvbnRhaW5lcihqYXZhUHJvamVjdExpdGUpOwotCQljb250YWluZXJzLmFkZChkZWZhdWx0T3V0cHV0Q29udGFpbmVyKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZW50cmllcykgewotCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJSUNvbnRhaW5lciBvdXRwdXRDb250YWluZXIgPSBnZXRKYXZhT3V0cHV0Q29udGFpbmVyKGphdmFQcm9qZWN0TGl0ZSwgZW50cnkpOwotCQkJCWlmICghY29udGFpbmVycy5jb250YWlucyhvdXRwdXRDb250YWluZXIpKSB7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKG91dHB1dENvbnRhaW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZXJzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGVudW0gSmF2YUNvbnRhaW5lclR5cGUgewotCQlTT1VSQ0UsIE9VVFBVVAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIEphdmEgb3V0cHV0IChpLmUuIHdoZXJlIHRoZSBjb21waWxlZCAuY2xhc3MgZmlsZXMgYXJlKQotCSAqIElDb250YWluZXJzIHdob3NlIHNvdXJjZSBpcyBleHBsaWNpdGx5IG1hcHBlZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCwKLQkgKiBvciBpZiB0aGUgb3V0cHV0IGNvbnRhaW5lciBpdHNlbGYgaXMgZXhwbGljaXRseSBtYXBwZWQuCi0JICogCi0JICogQHBhcmFtIHZpcnR1YWxDb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PElDb250YWluZXI+IGdldEphdmFPdXRwdXRDb250YWluZXJzKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHsKLQkJcmV0dXJuIGdldEphdmFDb250YWluZXJzKHZpcnR1YWxDb21wb25lbnQsIEphdmFDb250YWluZXJUeXBlLk9VVFBVVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgSmF2YSBzb3VyY2UgKGkuZS4gd2hlcmUgdGhlIC5qYXZhIGZpbGVzIGFyZSkgSUNvbnRhaW5lcnMKLQkgKiBleHBsaWNpdGx5IG1hcHBlZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlydHVhbENvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YVNvdXJjZUNvbnRhaW5lcnMoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCkgewotCQlyZXR1cm4gZ2V0SmF2YUNvbnRhaW5lcnModmlydHVhbENvbXBvbmVudCwgSmF2YUNvbnRhaW5lclR5cGUuU09VUkNFKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PElDb250YWluZXI+IGdldEphdmFDb250YWluZXJzKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIEphdmFDb250YWluZXJUeXBlIGphdmFDb250YWluZXJUeXBlKSB7Ci0JCWlmICh2aXJ0dWFsQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlJUHJvamVjdCBwcm9qZWN0ID0gdmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlTGl0ZS5OQVRVUkVfSUQpKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQotCQlJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSA9IEphdmFDb3JlTGl0ZS5jcmVhdGUocHJvamVjdCk7Ci0JCUxpc3Q8SUNvbnRhaW5lcj4gY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbnRhaW5lcj4oKTsKLQkJaWYgKGphdmFDb250YWluZXJUeXBlID09IEphdmFDb250YWluZXJUeXBlLk9VVFBVVCkgewotCQkJSUNvbnRhaW5lciBkZWZhdWx0T3V0cHV0Q29udGFpbmVyID0gZ2V0RGVmYXVsdEphdmFPdXRwdXRDb250YWluZXIoamF2YVByb2plY3RMaXRlKTsKLQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZGVmYXVsdE91dHB1dENvbnRhaW5lcik7Ci0JCQlmb3IgKElWaXJ0dWFsUmVzb3VyY2UgdmlydHVhbFJlc291cmNlIDogdmlydHVhbFJlc291cmNlcykgewotCQkJCWlmICh2aXJ0dWFsUmVzb3VyY2UuZ2V0Q29tcG9uZW50KCkuZXF1YWxzKHZpcnR1YWxDb21wb25lbnQpKSB7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKGRlZmF1bHRPdXRwdXRDb250YWluZXIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZW50cmllcykgewotCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJSVBhdGggc291cmNlUGF0aCA9IGVudHJ5LmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOyAvLyByZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgcGF0aAotCQkJCUlDb250YWluZXIgc291cmNlQ29udGFpbmVyID0gc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAwID8gcHJvamVjdCA6IHByb2plY3QuZ2V0Rm9sZGVyKHNvdXJjZVBhdGgpOwotCQkJCWlmIChzb3VyY2VDb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHNvdXJjZUNvbnRhaW5lcik7Ci0JCQkJCWZvciAoSVZpcnR1YWxSZXNvdXJjZSB2aXJ0dWFsUmVzb3VyY2UgOiB2aXJ0dWFsUmVzb3VyY2VzKSB7Ci0JCQkJCQlpZiAodmlydHVhbFJlc291cmNlLmdldENvbXBvbmVudCgpLmVxdWFscyh2aXJ0dWFsQ29tcG9uZW50KSkgewotCQkJCQkJCXN3aXRjaCAoamF2YUNvbnRhaW5lclR5cGUpIHsKLQkJCQkJCQljYXNlIFNPVVJDRToKLQkJCQkJCQkJaWYgKCFjb250YWluZXJzLmNvbnRhaW5zKHNvdXJjZUNvbnRhaW5lcikpIHsKLQkJCQkJCQkJCWNvbnRhaW5lcnMuYWRkKHNvdXJjZUNvbnRhaW5lcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBPVVRQVVQ6Ci0JCQkJCQkJCUlDb250YWluZXIgb3V0cHV0Q29udGFpbmVyID0gZ2V0SmF2YU91dHB1dENvbnRhaW5lcihqYXZhUHJvamVjdExpdGUsIGVudHJ5KTsKLQkJCQkJCQkJaWYgKCFjb250YWluZXJzLmNvbnRhaW5zKG91dHB1dENvbnRhaW5lcikpIHsKLQkJCQkJCQkJCWNvbnRhaW5lcnMuYWRkKG91dHB1dENvbnRhaW5lcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgSmF2YSBvdXRwdXQgSUNvbnRhaW5lciAoaS5lLiB3aGVyZSB0aGUgY29tcGlsZWQKLQkgKiAuY2xhc3MgZmlsZXMgZ28pCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0TGl0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0RGVmYXVsdEphdmFPdXRwdXRDb250YWluZXIoSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIGRlZmF1bHRPdXRwdXRQYXRoID0gamF2YVByb2plY3RMaXRlLnJlYWRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAoZGVmYXVsdE91dHB1dFBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKGRlZmF1bHRPdXRwdXRQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgb3V0cHV0IChpLmUuIHdoZXJlIHRoZSBjb21waWxlZCAuY2xhc3MgZmlsZXMgZ28pCi0JICogSUNvbnRhaW5lciBmb3IgdGhlIHNwZWNpZmllZCBJQ2xhc3NwYXRoRW50cnkKLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3RMaXRlCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRKYXZhT3V0cHV0Q29udGFpbmVyKElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIG91dHB1dFBhdGggPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAob3V0cHV0UGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvamVjdC5nZXRGb2xkZXIob3V0cHV0UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdEphdmFPdXRwdXRDb250YWluZXIoamF2YVByb2plY3RMaXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YVByb2plY3RMaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YVByb2plY3RMaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTQxZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFQcm9qZWN0TGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotCi0vKioKLSAqIEBzZWUgSUphdmFQcm9qZWN0TGl0ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVByb2plY3RMaXRlIGltcGxlbWVudHMgSUphdmFQcm9qZWN0TGl0ZSB7Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgX2phdmFQcm9qZWN0OwotCi0JcHJpdmF0ZSBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gX2phdmFQcm9qZWN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gX3Jhd0NsYXNzcGF0aFJlYWQgPSBmYWxzZTsKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIF9yYXdDbGFzc3BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIF9yYXdPdXRwdXRMb2NhdGlvblJlYWQgPSBmYWxzZTsKLQlwcml2YXRlIElQYXRoIF9yYXdPdXRwdXRMb2NhdGlvbjsKLQlwcml2YXRlIGxvbmcgX2RvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gSUZpbGUuTlVMTF9TVEFNUDsKLQotCUphdmFQcm9qZWN0TGl0ZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gamF2YVByb2plY3RJbml0aWFsaXplZCkgewotCQl0aGlzLl9qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLl9qYXZhUHJvamVjdEluaXRpYWxpemVkID0gamF2YVByb2plY3RJbml0aWFsaXplZDsKLQl9Ci0KLQl2b2lkIG1hcmtKYXZhUHJvamVjdEluaXRpYWxpemVkKCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCWlmICghX2phdmFQcm9qZWN0SW5pdGlhbGl6ZWQpIHsKLQkJCQlfamF2YVByb2plY3RJbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJZmx1c2hDbGFzc3BhdGgoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJcmV0dXJuIF9qYXZhUHJvamVjdEluaXRpYWxpemVkOwotCQl9Ci0JfQotCi0Jdm9pZCBmbHVzaENsYXNzcGF0aCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlfcmF3Q2xhc3NwYXRoUmVhZCA9IGZhbHNlOwotCQkJX3Jhd0NsYXNzcGF0aCA9IG51bGw7Ci0JCQlfcmF3T3V0cHV0TG9jYXRpb25SZWFkID0gZmFsc2U7Ci0JCQlfcmF3T3V0cHV0TG9jYXRpb24gPSBudWxsOwotCQkJX2RvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gSUZpbGUuTlVMTF9TVEFNUDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcCA9IElGaWxlLk5VTExfU1RBTVA7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBfZG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJaWYgKG1vZGlmaWNhdGlvblN0YW1wID09IElGaWxlLk5VTExfU1RBTVApIHsKLQkJCWZsdXNoQ2xhc3NwYXRoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGUgZG90Q2xhc3NwYXRoID0gX2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKCIuY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFkb3RDbGFzc3BhdGguZXhpc3RzKCkpIHsKLQkJCWZsdXNoQ2xhc3NwYXRoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1vZGlmaWNhdGlvblN0YW1wICE9IGRvdENsYXNzcGF0aC5nZXRNb2RpZmljYXRpb25TdGFtcCgpKSB7Ci0JCQlmbHVzaENsYXNzcGF0aCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlJRmlsZSBkb3RDbGFzc3BhdGggPSBfamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUoIi5jbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wID0gZG90Q2xhc3NwYXRoLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJX2RvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gcmVhZFJhd0NsYXNzcGF0aCgpIHsKLQkJaWYgKCFpc0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKSkgewotCQkJaWYgKEphdmFDb3JlTGl0ZS5pc0luaXRpYWxpemVkKF9qYXZhUHJvamVjdCkpIHsKLQkJCQltYXJrSmF2YVByb2plY3RJbml0aWFsaXplZCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGlzSmF2YVByb2plY3RJbml0aWFsaXplZCgpKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBfamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJdmVyaWZ5RG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlib29sZWFuIGRhdGFSZWFkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJZGF0YVJlYWQgPSBfcmF3Q2xhc3NwYXRoUmVhZDsKLQkJfQotCQlpZiAoIWRhdGFSZWFkKSB7Ci0JCQl1cGRhdGVEb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoID0gX2phdmFQcm9qZWN0LnJlYWRSYXdDbGFzc3BhdGgoKTsKLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCV9yYXdDbGFzc3BhdGhSZWFkID0gdHJ1ZTsKLQkJCQlfcmF3Q2xhc3NwYXRoID0gcmF3Q2xhc3NwYXRoOwotCQkJfQotCQl9Ci0JCXJldHVybiBfcmF3Q2xhc3NwYXRoOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJUGF0aCByZWFkT3V0cHV0TG9jYXRpb24oKSB7Ci0JCWlmICghaXNKYXZhUHJvamVjdEluaXRpYWxpemVkKCkpIHsKLQkJCWlmIChKYXZhQ29yZUxpdGUuaXNJbml0aWFsaXplZChfamF2YVByb2plY3QpKSB7Ci0JCQkJbWFya0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpc0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gX2phdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0KLQkJdmVyaWZ5RG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlib29sZWFuIGRhdGFSZWFkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJZGF0YVJlYWQgPSBfcmF3T3V0cHV0TG9jYXRpb25SZWFkOwotCQl9Ci0JCWlmICghZGF0YVJlYWQpIHsKLQkJCXVwZGF0ZURvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlJUGF0aCByYXdPdXRwdXRMb2NhdGlvbiA9IF9qYXZhUHJvamVjdC5yZWFkT3V0cHV0TG9jYXRpb24oKTsKLQkJCWlmIChyYXdPdXRwdXRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gYm9ycm93ZWQgZnJvbSBKYXZhUHJvamVjdC5nZXREZWZhdWx0T3V0cHV0TG9jYXRpb24oKQotCQkJCXJhd091dHB1dExvY2F0aW9uID0gX2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZCgiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCV9yYXdPdXRwdXRMb2NhdGlvblJlYWQgPSB0cnVlOwotCQkJCV9yYXdPdXRwdXRMb2NhdGlvbiA9IHJhd091dHB1dExvY2F0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBfcmF3T3V0cHV0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3RMaXRlI2dldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX2phdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBfamF2YVByb2plY3QuZXhpc3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3RMaXRlI2lzT3BlbigpCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcGVuKCkgewotCQlyZXR1cm4gX2phdmFQcm9qZWN0LmlzT3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0TGl0ZSNoYXNCdWlsZFN0YXRlKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNCdWlsZFN0YXRlKCkgewotCQlyZXR1cm4gX2phdmFQcm9qZWN0Lmhhc0J1aWxkU3RhdGUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0lKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkYWE0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0lKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSX05BTUUgPSAiSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVJfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSA9ICJJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyA9ICJJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTc5MWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLklFdmVudExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGluc3RhbGxDb25maWc7Ci0gICAgCi0JcHVibGljIEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpIAotCXsKLQkJdGhpcyggbmV3IEphdmFGYWNldEluc3RhbGxDb25maWcoKSApOwotCX0KLQkKLQlwdWJsaWMgSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCBmaW5hbCBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGluc3RhbGxDb25maWcgKQotCXsKLQkgICAgdGhpcy5pbnN0YWxsQ29uZmlnID0gaW5zdGFsbENvbmZpZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSAKLQl7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChKQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoU09VUkNFX0ZPTERFUl9OQU1FKTsKLSAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KCkKLSAgICB7Ci0gICAgICAgIHN1cGVyLmluaXQoKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElEYXRhTW9kZWwgZG0gPSBnZXREYXRhTW9kZWwoKTsKLSAgICAgICAgCi0gICAgICAgIGRtLnNldFByb3BlcnR5KCBGQUNFVF9JRCwgSmF2YUZhY2V0LklEICk7Ci0gICAgICAgIGRtLnNldFByb3BlcnR5KCBKQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHLCB0aGlzLmluc3RhbGxDb25maWcgKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzb3VyY2VGb2xkZXJOYW1lID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIHRoaXMuaW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCkuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgc291cmNlRm9sZGVyTmFtZSA9IHRoaXMuaW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCkuZ2V0KCAwICkudG9Qb3J0YWJsZVN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkbS5zZXRQcm9wZXJ0eSggU09VUkNFX0ZPTERFUl9OQU1FLCBzb3VyY2VGb2xkZXJOYW1lICk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgZGVmYXVsdE91dHB1dEZvbGRlck5hbWUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMuaW5zdGFsbENvbmZpZy5nZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlZmF1bHRPdXRwdXRGb2xkZXJOYW1lID0gdGhpcy5pbnN0YWxsQ29uZmlnLmdldERlZmF1bHRPdXRwdXRGb2xkZXIoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRtLnNldFByb3BlcnR5KCBERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSwgZGVmYXVsdE91dHB1dEZvbGRlck5hbWUgKTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIElFdmVudExpc3RlbmVyPEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQ+IGxpc3RlbmVyCi0gICAgICAgICAgICA9IG5ldyBJRXZlbnRMaXN0ZW5lcjxKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50PigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBDaGFuZ2VFdmVudCBldmVudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGV2ZW50LmdldFR5cGUoKSA9PSBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50LlR5cGUuU09VUkNFX0ZPTERFUlNfQ0hBTkdFRCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBpbnN0YWxsQ29uZmlnLmdldFNvdXJjZUZvbGRlcnMoKS5zaXplKCkgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gaW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCkuZ2V0KCAwICkudG9Qb3J0YWJsZVN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBkbS5zZXRQcm9wZXJ0eSggU09VUkNFX0ZPTERFUl9OQU1FLCB2YWwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZXZlbnQuZ2V0VHlwZSgpID09IEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQuVHlwZS5ERUZBVUxUX09VVFBVVF9GT0xERVJfQ0hBTkdFRCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gaW5zdGFsbENvbmZpZy5nZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCkudG9Qb3J0YWJsZVN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBkbS5zZXRQcm9wZXJ0eSggREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUsIHZhbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuaW5zdGFsbENvbmZpZy5hZGRMaXN0ZW5lciggbGlzdGVuZXIgKTsKLSAgICB9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcHJvcGVydHlWYWx1ZSApCi0gICAgewotICAgICAgICBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggU09VUkNFX0ZPTERFUl9OQU1FICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PElQYXRoPiBzb3VyY2VGb2xkZXJzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcHJvcGVydHlWYWx1ZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VGb2xkZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc291cmNlRm9sZGVycyA9IENvbGxlY3Rpb25zLjxJUGF0aD5zaW5nbGV0b25MaXN0KCBuZXcgUGF0aCggKFN0cmluZykgcHJvcGVydHlWYWx1ZSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuaW5zdGFsbENvbmZpZy5zZXRTb3VyY2VGb2xkZXJzKCBzb3VyY2VGb2xkZXJzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmluc3RhbGxDb25maWcuc2V0RGVmYXVsdE91dHB1dEZvbGRlciggbmV3IFBhdGgoIChTdHJpbmcpIHByb3BlcnR5VmFsdWUgKSApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIucHJvcGVydHlTZXQoIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhRmFjZXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjMxMmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuSmF2YUZhY2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgZGVwcmVjYXRlZC4gSmF2YUZhY2V0IGNsYXNzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLUBEZXByZWNhdGVkCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhRmFjZXRVdGlscwotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBKQVZBX0ZBQ0VUID0gSmF2YUZhY2V0LkZBQ0VUOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gSkFWQV8xMyA9IEphdmFGYWNldC5WRVJTSU9OXzFfMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfMTQgPSBKYXZhRmFjZXQuVkVSU0lPTl8xXzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQVZBXzUwID0gSmF2YUZhY2V0LlZFUlNJT05fMV81OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gSkFWQV82MCA9IEphdmFGYWNldC5WRVJTSU9OXzFfNjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlckxldmVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmFjZXRVdGlsLmdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmFjZXRVdGlsLmdldENvbXBpbGVyTGV2ZWwoIHByb2plY3QgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBpbGVyTGV2ZWwoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBKYXZhRmFjZXRVdGlsLnNldENvbXBpbGVyTGV2ZWwoIHByb2plY3QsIGZ2ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBpbGVyTGV2ZWwoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBsZXZlbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NoZWR1bGVGdWxsQnVpbGQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgSmF2YUZhY2V0VXRpbC5zY2hlZHVsZUZ1bGxCdWlsZCggcHJvamVjdCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDbGFzc3BhdGgoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBvbGR2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBuZXd2ZXIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIEphdmFGYWNldFV0aWwucmVzZXRDbGFzc3BhdGgoIHByb2plY3QsIG9sZHZlciwgbmV3dmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gY29tcGlsZXJMZXZlbFRvRmFjZXQoIGZpbmFsIFN0cmluZyB2ZXIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFGYWNldC5GQUNFVC5nZXRWZXJzaW9uKCB2ZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmYWNldFRvQ29tcGlsZXJMZXZlbCggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWQ1OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JcHVibGljIEphdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotICAgICAgICBDb2xsZWN0aW9uIHJlcXVpcmVkRmFjZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoSmF2YUZhY2V0LkZBQ0VUKTsKLSAgICAgICAgc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvV3RwVXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvV3RwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyZDdkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFd0cFV0aWxzIAotewotICAgIHByaXZhdGUgV3RwVXRpbHMoKSB7fQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXVFBfTkFUVVJFIAotICAgICAgICA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVNX05BVFVSRQotICAgICAgICA9ICJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLkphdmFFTUZOYXR1cmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTkFUVVJFUyA9IHtXVFBfTkFUVVJFLCBKRU1fTkFUVVJFfTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlcyggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQVRVUkVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKE5BVFVSRVNbaV0pKSB7Ci0JCQkJUHJvamVjdFV0aWxpdGllcy5hZGROYXR1cmVUb1Byb2plY3QocHJvamVjdCwgTkFUVVJFU1tpXSk7Ci0JCQl9Ci0JCX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlc3RvRUFSKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIAotCXsKLQkgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCSAgICBmaW5hbCBTdHJpbmdbXSBjdXJyZW50ID0gZGVzYy5nZXROYXR1cmVJZHMoKTsKLQkgICAgZmluYWwgU3RyaW5nW10gcmVwbGFjZW1lbnQgPSBuZXcgU3RyaW5nWyBjdXJyZW50Lmxlbmd0aCArIDEgXTsKLQkgICAgU3lzdGVtLmFycmF5Y29weSggY3VycmVudCwgMCwgcmVwbGFjZW1lbnQsIDAsIGN1cnJlbnQubGVuZ3RoICk7Ci0JICAgIHJlcGxhY2VtZW50WyBjdXJyZW50Lmxlbmd0aCBdID0gV1RQX05BVFVSRTsKLQkgICAgZGVzYy5zZXROYXR1cmVJZHMoIHJlcGxhY2VtZW50ICk7Ci0JICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oIGRlc2MsIG51bGwgKTsKLQl9ICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmF0dXJlcyggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAKLQl7Ci0gICAgCVByb2plY3RVdGlsaXRpZXMucmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoIHByb2plY3QsIFdUUF9OQVRVUkUgKTsKLSAgICAJUHJvamVjdFV0aWxpdGllcy5yZW1vdmVOYXR1cmVGcm9tUHJvamVjdCggcHJvamVjdCwgSkVNX05BVFVSRSApOwotCX0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0RhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvRGF0YU1vZGVsVG9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWVlMWJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvRGF0YU1vZGVsVG9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YU1vZGVsVG9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnQWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IEphdmFGYWNldEluc3RhbGxDb25maWcuY2xhc3MgfTsKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIGFkYXB0ZXJUeXBlID09IEphdmFGYWNldEluc3RhbGxDb25maWcuY2xhc3MgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIGFkYXB0YWJsZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGRtLmdldFByb3BlcnR5KCBJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0phdmFGYWNldEluc3RhbGxDb25maWdUb0RhdGFNb2RlbEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJjNGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ1RvRGF0YU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFGYWNldEluc3RhbGxDb25maWdUb0RhdGFNb2RlbEFkYXB0ZXIKLQotICAgIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci0gICAgCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJRGF0YU1vZGVsLmNsYXNzIH07Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKCBmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkKLSAgICB7Ci0gICAgICAgIGlmKCBhZGFwdGVyVHlwZSA9PSBJRGF0YU1vZGVsLmNsYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyIAotICAgICAgICAgICAgICAgID0gbmV3IEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciggKEphdmFGYWNldEluc3RhbGxDb25maWcpIGFkYXB0YWJsZSApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoIHByb3ZpZGVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gQURBUFRFUl9UWVBFUzsKLSAgICB9Ci0KLX0K