ZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyYWJmNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZDQ1My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmIwYzg4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBwcm9qZWN0IFNESwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTBlMDUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5zZGsiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZTQzNDAuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxZGRlNi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhY2I2NS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMTowNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2VwbC12MTAuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1OGZlNi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHByb2plY3QgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0NWM0Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvbGljZW5zZS5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWU0MzQwLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmJpbi5kaXN0LnppcAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YWFlYzIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwYjRiYy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0L2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWU0MmJiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBSdW50aW1lCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhZTU2MS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyNTRiMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0IGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWIwNGMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWM2MTNlLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaSBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4YTMyNS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5tYXBwaW5ncyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTliZmNlLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2ZiMGUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmMTMzZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdCI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVhMDhkLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDQ4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitidWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBhNmU4YTU0Li5lZDBmNDJkIDEwMDY0NAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSIxLjAuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgogICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgogCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5mZWF0dXJlIi8+CiAgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmZlYXR1cmUiLz4KICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMiLz4gIAorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYyIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRhdGF0b29scy5kb2MudXNlciIvPgogICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIvPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ0ODdjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggMjAzNGNhYy4uYjEzNmYwZSAxMDA2NDQKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiwzMSArMiwzNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZSIKICAgICAgIGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIChKUEEpIEpVbml0IFRlc3RzIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iMS4wLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgogCiAgICA8ZGVzY3JpcHRpb24+CiAgICAgICAlZGVzY3JpcHRpb24KICAgIDwvZGVzY3JpcHRpb24+CiAKLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KICAgIDxjb3B5cmlnaHQ+CiAgICAgICAlY29weXJpZ2h0CiAgICA8L2NvcHlyaWdodD4KIAorICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgorICAgICAgJWxpY2Vuc2UKKyAgIDwvbGljZW5zZT4KKwogICAgPHBsdWdpbgogICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzIgogICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKICAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIiAvPgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KIAogICAgPHBsdWdpbgogICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzIgogICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKICAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIiAvPgorICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgogCiA8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2NWQzZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDMgQEAKK2ZlYXR1cmUudGVtcC5mb2xkZXIKK2J1aWxkLnhtbAorb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlXzEuMC4xLioKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDc4ZjNkZTEuLmFlZWE0NjIgMTAwNjQ0Ci0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjEuMC4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNGM2YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhNWRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0YjhjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDozOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyYzI4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1OTo0MiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTRkOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYi51aQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsOyB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuanB0LmRiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWksCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmVkaXRvci5jb3JlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzNiZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTY5ODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2NDhhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwZTU4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIERCIFVJCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmZlODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdWkvaW50ZXJuYWwvRFRQVWlUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwudWkud2l6YXJkcy5DUFdpemFyZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC51aS53aXphcmRzLk5ld0NQV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwudWkud2l6YXJkcy5Qcm9maWxlV2l6YXJkUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS51aS53aXphcmRzLklXaXphcmRDYXRlZ29yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9maWxlVWlUb29scwotICovCi1wdWJsaWMgY2xhc3MgRFRQVWlUb29scyB7Ci0JCi0JLyoqCi0JICogTGF1bmNoIHRoZSBEVFAgTmV3IENvbm5lY3Rpb24gUHJvZmlsZSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhZGRlZCBwcm9maWxlLCBvciBudWxsIGlmIHRoZSB3aXphcmQgaXMgY2FuY2VsbGVkLiBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgCi0JICogY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGFkZGVkIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVOZXdQcm9maWxlKCkgewotCQlOZXdDUFdpemFyZCB3aXphcmQ7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2c7Ci0KLQkJLy8gRmlsdGVyIGRhdGFzb3VyY2UgY2F0ZWdvcnkKLQkgIAlWaWV3ZXJGaWx0ZXIgdmlld2VyRmlsdGVyID0gbmV3IFZpZXdlckZpbHRlcigpIHsKLQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KCBWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkKLQkJCQlDUFdpemFyZE5vZGUgd2l6YXJkTm9kZSA9ICggQ1BXaXphcmROb2RlKSBlbGVtZW50OwotCQkJCWlmKCAhKCB3aXphcmROb2RlLmdldFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcikpIHsKLQkJCQkJSUNhdGVnb3J5IGNhdCA9IENvbm5lY3Rpb25Qcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb3ZpZGVyKAotCQkJCQkJCQkJKCggUHJvZmlsZVdpemFyZFByb3ZpZGVyKSB3aXphcmROb2RlLmdldFByb3ZpZGVyKCkpLmdldFByb2ZpbGUoKSkuZ2V0Q2F0ZWdvcnkoKTsKLQkJCQkJCi0JCQkJCS8vIE9ubHkgZGlzcGxheSB3aXphcmRzIGJlbG9uZyB0byBkYXRhYmFzZSBjYXRlZ29yeQotCQkJCQl3aGlsZSggY2F0ICE9IG51bGwpIHsKLQkJCQkJCWlmKCBjYXQuZ2V0SWQoKS5lcXVhbHMoIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeS5EQVRBQkFTRV9DQVRFR09SWV9JRCkpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJY2F0ID0gY2F0LmdldFBhcmVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJd2l6YXJkID0gbmV3IE5ld0NQV2l6YXJkKCB2aWV3ZXJGaWx0ZXIsIG51bGwpOwotCQlTaGVsbCBjdXJyZW50U2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQl3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKCBjdXJyZW50U2hlbGwsIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3BlbiggdHJ1ZSk7Ci0JCQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFByb2ZpbGVMaXN0ZW5lciggbGlzdGVuZXIpOwotCQkKLQkJaWYoIHdpemFyZERpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlDb25uZWN0aW9uUHJvZmlsZSBhZGRlZFByb2ZpbGUgPSBsaXN0ZW5lci5hZGRlZFByb2ZpbGU7Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JCQotCQlyZXR1cm4gYWRkZWRQcm9maWxlLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbFByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9maWxlTGlzdGVuZXIgewotCQlJQ29ubmVjdGlvblByb2ZpbGUgYWRkZWRQcm9maWxlOwotCQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZUFkZGVkKCBJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJYWRkZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZCggSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBwcm9maWxlRGVsZXRlZCggSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQkJICAKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0M2NjNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3NWE0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2VhMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6MjkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6MTggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkyNmRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5KcHREYlBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuZWRpdG9yLmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3M2JkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZWFkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0YzM5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmRiIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3YTJkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIERCCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9DYXRhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9DYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNDIzOGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBDYXRhbG9ncwotICovCi1maW5hbCBjbGFzcyBDYXRhbG9nIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8Q2F0YWxvZz4gewotCXByaXZhdGUgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2U7Ci0JZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZzsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgY2F0YWxvZ0xpc3RlbmVyOwkJLy9UT0RPIGxpc3RlbiBmb3IgY2hhbmdlCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JQ2F0YWxvZyggRGF0YWJhc2UgZGF0YWJhc2UsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOwotCQl0aGlzLmR0cENhdGFsb2cgPSBkdHBDYXRhbG9nOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc09ubGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuY29ubmVjdGlvbklzT25saW5lKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGJ1aWxkQ2F0YWxvZ0xpc3RlbmVyKCkgewotICAgICAgIHJldHVybiBuZXcgSUNhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKLSAgICAJICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoIGZpbmFsIElDYXRhbG9nT2JqZWN0IGNhdGFsb2csIGZpbmFsIGludCBldmVudFR5cGUpIHsgICAgIAotICAgIAkJCWlmKCBjYXRhbG9nID09IENhdGFsb2cudGhpcy5kdHBDYXRhbG9nKSB7CQotLy8gICAgCQkJCUNhdGFsb2cudGhpcy5yZWZyZXNoKCk7Ci0vLyAgICAJCQkJQ2F0YWxvZy50aGlzLmRhdGFiYXNlLmNhdGFsb2dDaGFuZ2VkKCBDYXRhbG9nLnRoaXMsIGV2ZW50VHlwZSk7Ci0gICAgCQkJfQotICAgIAkgICAgfQotICAgICAgICB9OwotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0vLwkJdGhpcy5yZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBDYXRhbG9nLCB0aGlzLmNhdGFsb2dMaXN0ZW5lcik7Ci0JfQotCQotCWJvb2xlYW4gd3JhcHMoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZyA9PSBjYXRhbG9nOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDYXRhbG9nLmdldE5hbWUoKTsKLQl9Ci0JCi0JYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCX0KLQotCUNvbHVtbiBjb2x1bW4oIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmNvbHVtbihkdHBDb2x1bW4pOwotCX0KLQotCS8vICoqKioqIHNjaGVtYXRhCi0KLQlzeW5jaHJvbml6ZWQgU2V0PFNjaGVtYT4gYnVpbGRTY2hlbWF0YSgpIHsKLQkJRUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEgPSB0aGlzLmR0cFNjaGVtYXRhKCk7Ci0JCQotCQlTZXQ8U2NoZW1hPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTY2hlbWE+KCBkdHBTY2hlbWF0YS5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hIDogZHRwU2NoZW1hdGEpIHsKLQkJCXJlc3VsdC5hZGQoIHRoaXMud3JhcChkdHBTY2hlbWEpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cuZ2V0U2NoZW1hcygpOwotCX0KLQotCXByaXZhdGUgU2NoZW1hIHdyYXAoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgc2NoZW1hKSB7Ci0KLQkJcmV0dXJuIG5ldyBTY2hlbWEoIHRoaXMuZGF0YWJhc2UsIHNjaGVtYSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSggdGhpcy5nZXROYW1lKCksIGNhdGFsb2cuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0NvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2JhMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuUHJlZGVmaW5lZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBDb2x1bW4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbHVtbiBleHRlbmRzIERUUFdyYXBwZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPENvbHVtbj4gewotCXByaXZhdGUgZmluYWwgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbjsKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgY29sdW1uTGlzdGVuZXI7Ci0KLQkvLyBUT0RPIE9iamVjdCBpcyB0aGUgZGVmYXVsdD8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBERUZBVUxUX0pBVkFfVFlQRSA9IG5ldyBKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIEJMT0JfSkFWQV9UWVBFID0gbmV3IEphdmFUeXBlKGphdmEuc3FsLkJsb2IuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIEJZVEVfQVJSQVlfSkFWQV9UWVBFID0gbmV3IEphdmFUeXBlKGJ5dGVbXS5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBDTE9CX0pBVkFfVFlQRSA9IG5ldyBKYXZhVHlwZShqYXZhLnNxbC5DbG9iLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTVFJJTkdfSkFWQV9UWVBFID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlDb2x1bW4oIFRhYmxlIHRhYmxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlzdXBlcigpOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZHRwQ29sdW1uID0gZHRwQ29sdW1uOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiggdGhpcy5jb25uZWN0aW9uSXNPbmxpbmUoKSkgewotCQkJdGhpcy5jb2x1bW5MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2x1bW5MaXN0ZW5lcigpOwotCQkJdGhpcy5hZGRDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBDb2x1bW4sIHRoaXMuY29sdW1uTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc09ubGluZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuY29ubmVjdGlvbklzT25saW5lKCk7Ci0JfQotCQotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBidWlsZENvbHVtbkxpc3RlbmVyKCkgewotICAgICAgIHJldHVybiBuZXcgSUNhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKLSAgICAJICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoIGZpbmFsIElDYXRhbG9nT2JqZWN0IGNvbHVtbiwgZmluYWwgaW50IGV2ZW50VHlwZSkgeyAKLS8vCQkJCVRPRE8KLS8vICAgIAkJCWlmKCBjb2x1bW4gPT0gQ29sdW1uLnRoaXMuZHRwQ29sdW1uKSB7CSAgICAJICAgIAkKLS8vICAgIAkJCQlDb2x1bW4udGhpcy50YWJsZS5jb2x1bW5DaGFuZ2VkKCBDb2x1bW4udGhpcywgZXZlbnRUeXBlKTsKLS8vICAgIAkJCX0KLSAgICAJICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJCi0JCXRoaXMucmVtb3ZlQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwQ29sdW1uLCB0aGlzLmNvbHVtbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBkYXRhVHlwZU5hbWUoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkYXRhVHlwZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBqYXZhRmllbGROYW1lKCkgewotCQlTdHJpbmcgak5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJaWYgKCAhIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWpOYW1lID0gak5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlyZXR1cm4gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGpOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzSmF2YUZpZWxkTmFtZShTdHJpbmcgamF2YUZpZWxkTmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0Nhc2VTZW5zaXRpdmUoKSA/Ci0JCQl0aGlzLmdldE5hbWUoKS5lcXVhbHMoamF2YUZpZWxkTmFtZSkKLQkJOgotCQkJdGhpcy5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShqYXZhRmllbGROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgamF2YVR5cGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVR5cGUoKS5kZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JcHVibGljIEphdmFUeXBlIGphdmFUeXBlKCkgewotCQlEYXRhVHlwZSBkYXRhVHlwZSA9IHRoaXMuZHRwQ29sdW1uLmdldERhdGFUeXBlKCk7Ci0JCXJldHVybiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBQcmVkZWZpbmVkRGF0YVR5cGUpID8KLQkJCXRoaXMuanBhU3BlY0NvbXBsaWFudEphdmFUeXBlKERUUFRvb2xzLmphdmFUeXBlRm9yKCgoUHJlZGVmaW5lZERhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0UHJpbWl0aXZlVHlwZSgpKSkKLQkJOgotCQkJREVGQVVMVF9KQVZBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogVGhlIEpEQkMgc3BlYyBzYXlzIEpEQkMgZHJpdmVycyBzaG91bGQgYmUgYWJsZSB0byBtYXAgQkxPQnMgYW5kIENMT0JzCi0JICogZGlyZWN0bHksIGJ1dCB0aGUgSlBBIHNwZWMgZG9lcyBub3QgYWxsb3cgdGhlbS4KLQkgKi8KLQlwcml2YXRlIEphdmFUeXBlIGpwYVNwZWNDb21wbGlhbnRKYXZhVHlwZShKYXZhVHlwZSBqYXZhVHlwZSkgewotCQlpZiAoamF2YVR5cGUuZXF1YWxzKEJMT0JfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIEJZVEVfQVJSQVlfSkFWQV9UWVBFOwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoQ0xPQl9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gU1RSSU5HX0pBVkFfVFlQRTsKLQkJfQotCQlyZXR1cm4gamF2YVR5cGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIFByZWRlZmluZWREYXRhVHlwZSkgPwotCQkJRFRQVG9vbHMuZGF0YVR5cGVJc0xvYigoKFByZWRlZmluZWREYXRhVHlwZSkgZGF0YVR5cGUpLmdldFByaW1pdGl2ZVR5cGUoKSkKLQkJOgotCQkJZmFsc2U7Ci0JfQotCi0JYm9vbGVhbiB3cmFwcyggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uID09IGNvbHVtbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoIHRoaXMuZ2V0TmFtZSgpLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZTczNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLQotCi0vKioKLSAqICBDb25uZWN0aW9uIHdyYXBwZXIgYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbm5lY3Rpb24gZXh0ZW5kcyBEVFBXcmFwcGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxDb25uZWN0aW9uPiB7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSB3cmFwcGVyIGZvciB0aGUgZ2l2ZW4gSU1hbmFnZWRDb25uZWN0aW9uLgotCSAqLwotCXN0YXRpYyBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24oIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uIGR0cENvbm5lY3Rpb24pIHsKLQkJcmV0dXJuICggZHRwQ29ubmVjdGlvbiA9PSBudWxsKSA/IE51bGxDb25uZWN0aW9uLmluc3RhbmNlKCkgOiBuZXcgRFRQQ29ubmVjdGlvbldyYXBwZXIoIGR0cENvbm5lY3Rpb24pOwotCX0KLQotCUNvbm5lY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCWFic3RyYWN0IHZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSk7Ci0KLQlhYnN0cmFjdCB2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKTsKLQkKLQlhYnN0cmFjdCB2b2lkIHRhYmxlQ2hhbmdlZCggVGFibGUgdGFibGUsIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKTsKLQkKLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0JCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZhY3RvcnlJZCgpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSggdGhpcy5nZXROYW1lKCksIGNvbm5lY3Rpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NzhjYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotCi0vKioKLSAqIENvbm5lY3Rpb25MaXN0ZW5lciBpbnRlZ3JhdGUgdGggRFRQIElNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyLgotICogVGhpcyBjbGFzcyBwdXJwb3NlIGlzIHRvIGRlY291cGxlIGZyb20gdGhlIERUUCBsaXN0ZW5lcnMgYnkgYWNjZXB0aW5nIHdyYXBwZXJzIGFzIHBhcmFtZXRlci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkxpc3RlbmVyIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBvcGVuZWQoIENvbm5lY3Rpb24gY29ubmVjdGlvbik7Ci0gICAgcHVibGljIHZvaWQgbW9kaWZpZWQoIENvbm5lY3Rpb24gY29ubmVjdGlvbik7Ci0gICAgcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pOwotICAgIHB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZSggQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKLSAgICBwdWJsaWMgdm9pZCBjbG9zZWQoIENvbm5lY3Rpb24gY29ubmVjdGlvbik7Ci0KLSAgICBwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoIENvbm5lY3Rpb24gY29ubmVjdGlvbiwgRGF0YWJhc2UgZGF0YWJhc2UpOwotICAgIHB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoIENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU2NoZW1hIHNjaGVtYSk7Ci0gICAgcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFRhYmxlIHRhYmxlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvblByb2ZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0Nvbm5lY3Rpb25Qcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTNiYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvblByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9maWxlIHdyYXBwZXIgYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbm5lY3Rpb25Qcm9maWxlIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8Q29ubmVjdGlvblByb2ZpbGU+IHsKLQkKLQlwcml2YXRlIENvbm5lY3Rpb24gY29ubmVjdGlvbjsgLy8gTGF6eSBpbml0aWFsaXplZAotCXByaXZhdGUgRGF0YWJhc2UgZGF0YWJhc2U7IC8vIExhenkgaW5pdGlhbGl6ZWQKLQlwcml2YXRlIFN0cmluZyBjYXRhbG9nTmFtZTsgIC8vIENhdGFsb2cgdXNlZCBmb3IgdGhpcyBwcm9maWxlCi0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IHByb2ZpbGVSZXBvc2l0b3J5OwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXN0YXRpYyBDb25uZWN0aW9uUHJvZmlsZSBjcmVhdGVQcm9maWxlKCBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgcHJvZmlsZVJlcG9zaXRvcnksIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJcmV0dXJuICggZHRwUHJvZmlsZSA9PSBudWxsKSA/IE51bGxDb25uZWN0aW9uUHJvZmlsZS5pbnN0YW5jZSgpIDogbmV3IERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciggcHJvZmlsZVJlcG9zaXRvcnksIGR0cFByb2ZpbGUpOwotCX0KLQotCUNvbm5lY3Rpb25Qcm9maWxlKCBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgcHJvZmlsZVJlcG9zaXRvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9maWxlUmVwb3NpdG9yeSA9IHByb2ZpbGVSZXBvc2l0b3J5OwotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY2F0YWxvZ05hbWUgPSAiIjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb25uZWN0KCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZGlzY29ubmVjdCgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb25uZWN0aW9uIGJ1aWxkQ29ubmVjdGlvbigpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBEYXRhYmFzZSBidWlsZERhdGFiYXNlKCk7Ci0JCi0JYWJzdHJhY3Qgdm9pZCBkYXRhYmFzZUNoYW5nZWQoIERhdGFiYXNlIGRiLCBpbnQgZXZlbnRUeXBlKTsKLQkKLQlhYnN0cmFjdCB2b2lkIGNhdGFsb2dDaGFuZ2VkKCBDYXRhbG9nIGNhdGFsb2csIERhdGFiYXNlIGRiLCBpbnQgZXZlbnRUeXBlKTsKLQkKLQlhYnN0cmFjdCB2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRiLCBpbnQgZXZlbnRUeXBlKTsKLQkKLQlhYnN0cmFjdCB2b2lkIHRhYmxlQ2hhbmdlZCggVGFibGUgdGFibGUsIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRiLCBpbnQgZXZlbnRUeXBlKTsKLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hEYXRhYmFzZSgpIHsKLQkJdGhpcy5kaXNwb3NlRGF0YWJhc2UoKTsKLQkJdGhpcy5kYXRhYmFzZSA9IG51bGw7Ci0gICAgfQotICAgIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmRpc3Bvc2VDb25uZWN0aW9uKCk7Ci0JCXRoaXMuZGlzcG9zZURhdGFiYXNlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlQ29ubmVjdGlvbigpIHsKLQkJaWYoIHRoaXMuY29ubmVjdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmdldENvbm5lY3Rpb24oKS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VEYXRhYmFzZSgpIHsKLQkJaWYoIHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJdGhpcy5nZXREYXRhYmFzZSgpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0JCi0JcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKLQkJCi0JCWlmKCB0aGlzLmNvbm5lY3Rpb24gPT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uID0gdGhpcy5idWlsZENvbm5lY3Rpb24oKTsKLQkJCXRoaXMuZW5nYWdlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0KLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOwotCX0KLQotCXB1YmxpYyBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJCi0JCWlmKCB0aGlzLmRhdGFiYXNlID09IG51bGwpIHsKLQkJCXRoaXMuZGF0YWJhc2UgPSB0aGlzLmJ1aWxkRGF0YWJhc2UoKTsKLQkJCXRoaXMuc2V0RGVmYXVsdENhdGFsb2dOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2U7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YWJhc2VOYW1lKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFVybCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VXNlck5hbWUoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SW5zdGFuY2VJZCgpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm92aWRlcklkKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JZCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29ubmVjdGVkKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uSXNPbmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCk7Ci0JfQotCQotCWFic3RyYWN0IGJvb2xlYW4gd3JhcHMoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpOwotCQotCXB1YmxpYyBib29sZWFuIGlzTnVsbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSBnZXRQcm9maWxlUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvZmlsZVJlcG9zaXRvcnk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgY2F0YWxvZyBuYW1lIGZvciB0aGlzIHByb2ZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENhdGFsb2dOYW1lKCkgewotCQl0aGlzLnNldENhdGFsb2dOYW1lKCB0aGlzLmRhdGFiYXNlLmdldERlZmF1bHRDYXRhbG9nTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gb25seSBzZXQgdGhlIGNhdGFsb2cgdG8gdXNlIGZvciB0aGlzIHByb2ZpbGUsIHdoZW4gdGhlIGRhdGFiYXNlIHN1cHBvcnRzIGNhdGFsb2dzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGFsb2dOYW1lKCBTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQkJaWYoIHRoaXMuY2F0YWxvZ05hbWUgPT0gY2F0YWxvZ05hbWUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiggdGhpcy5kYXRhYmFzZS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCVN0cmluZyBuYW1lID0gKCBjYXRhbG9nTmFtZSAhPSBudWxsKSA/IGNhdGFsb2dOYW1lIDogdGhpcy5kYXRhYmFzZS5nZXREZWZhdWx0Q2F0YWxvZ05hbWUoKTsKLQkJCQotCQkJQ2F0YWxvZyBjYXRhbG9nID0gdGhpcy5kYXRhYmFzZS5jYXRhbG9nTmFtZWQoIG5hbWUpOwotCQkJaWYoIGNhdGFsb2cgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmNhdGFsb2dOYW1lID0gbmFtZTsKLQkJCXRoaXMuZGF0YWJhc2UucmVmcmVzaCgpOwotCQkJdGhpcy5jYXRhbG9nQ2hhbmdlZCggY2F0YWxvZywgdGhpcy5kYXRhYmFzZSwgSUNhdGFsb2dPYmplY3RMaXN0ZW5lci5FdmVudFR5cGVFbnVtZXJhdGlvbi5FTEVNRU5UX1JFRlJFU0gpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jYXRhbG9nTmFtZSA9ICIiOwotCQkJdGhpcy5kYXRhYmFzZS5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgYWRkUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgcmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb24gYykgewotCQkJCUNvbm5lY3Rpb25Qcm9maWxlLnRoaXMucmVmcmVzaERhdGFiYXNlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb24gYykgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvbiBjKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb24gYykgewotCQkJCUNvbm5lY3Rpb25Qcm9maWxlLnRoaXMucmVmcmVzaERhdGFiYXNlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGMsIGZpbmFsIERhdGFiYXNlIGRiKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvbiBjLCBmaW5hbCBTY2hlbWEgc2NoZW1hKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uIGMsIGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX07Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5hZGRDb25uZWN0aW9uTGlzdGVuZXIoIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKCB0aGlzLmdldE5hbWUoKSwgY29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0Nvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZTdlYTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqICBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgaXMgYSBtZWRpYXRvciB0byB0aGUgRFRQIFByb2ZpbGVNYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IHsKLQlwcml2YXRlIFByb2ZpbGVNYW5hZ2VyIGR0cFByb2ZpbGVNYW5hZ2VyOwotCQotCXByaXZhdGUgTG9jYWxSZXBvc2l0b3J5TGlzdGVuZXIgcmVwb3NpdG9yeUxpc3RlbmVyOwotCXByaXZhdGUgTG9jYWxQcm9maWxlTGlzdGVuZXIgcHJvZmlsZUxpc3RlbmVyOwotCXByaXZhdGUgU2V0PENvbm5lY3Rpb25Qcm9maWxlPiBwcm9maWxlczsKLQotCXByaXZhdGUgc3RhdGljIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSBJTlNUQU5DRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX0NBVEVHT1JZX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBzaW5nbGV0b24gc3VwcG9ydAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IGluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlciA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUxpc3RlbmVycygpIHsKLQotCQlpZiggdGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIgPSBuZXcgTG9jYWxSZXBvc2l0b3J5TGlzdGVuZXIoKTsKLQkJCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuYWRkUHJvZmlsZUxpc3RlbmVyKCB0aGlzLnJlcG9zaXRvcnlMaXN0ZW5lcik7Ci0JCX0KLQkJaWYoIHRoaXMucHJvZmlsZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbmV3IExvY2FsUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmFkZFByb2ZpbGVMaXN0ZW5lciggdGhpcy5wcm9maWxlTGlzdGVuZXIpOwkKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2VMaXN0ZW5lcnMoKSB7Ci0JCWZvciggSXRlcmF0b3I8Q29ubmVjdGlvblByb2ZpbGU+IHN0cmVhbSA9IHRoaXMucHJvZmlsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiggdGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5yZW1vdmVQcm9maWxlTGlzdGVuZXIoIHRoaXMucmVwb3NpdG9yeUxpc3RlbmVyKTsKLQkJCXRoaXMucmVwb3NpdG9yeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCQlpZiggdGhpcy5wcm9maWxlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5yZW1vdmVQcm9maWxlTGlzdGVuZXIoIHRoaXMucHJvZmlsZUxpc3RlbmVyKTsKLQkJCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb25XaXRoUHJvZmlsZU5hbWVkKCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5wcm9maWxlTmFtZWQoIG5hbWUpLmdldENvbm5lY3Rpb24oKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMucHJvZmlsZXMudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBwcm9maWxlcwotCi0JcHVibGljIEl0ZXJhdG9yPENvbm5lY3Rpb25Qcm9maWxlPiBwcm9maWxlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvZmlsZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHByb2ZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPENvbm5lY3Rpb25Qcm9maWxlLCBTdHJpbmc+KCB0aGlzLnByb2ZpbGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCQkgcmV0dXJuIHByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlTmFtZWQoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciggSXRlcmF0b3I8Q29ubmVjdGlvblByb2ZpbGU+IHN0cmVhbSA9IHRoaXMucHJvZmlsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmKCBwcm9maWxlLmdldE5hbWUoKS5lcXVhbHMoIG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHByb2ZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE51bGxDb25uZWN0aW9uUHJvZmlsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcml2YXRlIFNldDxDb25uZWN0aW9uUHJvZmlsZT4gZ2V0UHJvZmlsZXMoKSB7Ci0KLQkJaWYoIHRoaXMucHJvZmlsZXMgPT0gbnVsbCkgewotCQkJdGhpcy5wcm9maWxlcyA9IHRoaXMuYnVpbGRQcm9maWxlcygpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByb2ZpbGVzOwotCX0KLQotCXByaXZhdGUgU2V0PENvbm5lY3Rpb25Qcm9maWxlPiBidWlsZFByb2ZpbGVzKCkgewotCQlJQ29ubmVjdGlvblByb2ZpbGVbXSBkdHBQcm9maWxlcyA9IHRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuZ2V0UHJvZmlsZXMoKTsKLQkJU2V0PENvbm5lY3Rpb25Qcm9maWxlPiByZXN1bHQgPSBuZXcgSGFzaFNldDxDb25uZWN0aW9uUHJvZmlsZT4oIGR0cFByb2ZpbGVzLmxlbmd0aCk7Ci0JCWZvciAoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUgOiBkdHBQcm9maWxlcykgewotCQkJcmVzdWx0LmFkZCggQ29ubmVjdGlvblByb2ZpbGUuY3JlYXRlUHJvZmlsZSggdGhpcywgZHRwUHJvZmlsZSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jdm9pZCBhZGRQcm9maWxlKCBJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkKLQkJaWYoICF0aGlzLnByb2ZpbGVFeGlzdHMoIGR0cFByb2ZpbGUpKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBuZXdQcm9maWxlID0gQ29ubmVjdGlvblByb2ZpbGUuY3JlYXRlUHJvZmlsZSggQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LnRoaXMsIGR0cFByb2ZpbGUpOwotCQkJdGhpcy5wcm9maWxlcy5hZGQoIG5ld1Byb2ZpbGUpOwotCQl9Ci0JfQotCQotCXZvaWQgcmVtb3ZlUHJvZmlsZSggSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCi0JCXRoaXMucHJvZmlsZXMucmVtb3ZlKCB0aGlzLmdldFByb2ZpbGUoIGR0cFByb2ZpbGUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHByb2ZpbGVFeGlzdHMoIElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0KLQkJcmV0dXJuICggdGhpcy5nZXRQcm9maWxlKCBkdHBQcm9maWxlKSA9PSBudWxsKSA/IGZhbHNlIDogdHJ1ZTsKLQl9Ci0KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRQcm9maWxlKCBJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkKLQkJZm9yKCBJdGVyYXRvcjxDb25uZWN0aW9uUHJvZmlsZT4gc3RyZWFtID0gdGhpcy5wcm9maWxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYoIHByb2ZpbGUud3JhcHMoIGR0cFByb2ZpbGUpKSB7Ci0JCQkJcmV0dXJuIHByb2ZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lci5hZGRQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9maWxlTGlzdGVuZXIoIFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKLQkJdGhpcy5wcm9maWxlTGlzdGVuZXIucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSB2b2lkIGFkZEludGVybmFsUHJvZmlsZUxpc3RlbmVyKCBJUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5hZGRQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHZvaWQgcmVtb3ZlSW50ZXJuYWxQcm9maWxlTGlzdGVuZXIoIElQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCi0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCS8qKgotCSAqIExpc3RlbnMgdG8gUHJvZmlsZU1hbmFnZXIgZXZlbnRzIGFuZCB1cGRhdGVzIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXByaXZhdGUgY2xhc3MgTG9jYWxSZXBvc2l0b3J5TGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQotCQlMb2NhbFJlcG9zaXRvcnlMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQWRkZWQoIElDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQkJQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LnRoaXMuYWRkUHJvZmlsZSggY29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoIElDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoIElDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQkJQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LnRoaXMucmVtb3ZlUHJvZmlsZSggY29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5lciB0cmFuc2xhdGVzIGFuZCBmb3J3YXJkcyBJUHJvZmlsZUxpc3RlbmVyIGV2ZW50cyB0byBQcm9maWxlTGlzdGVuZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbFByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9maWxlTGlzdGVuZXIgewotCQlwcml2YXRlIENvbGxlY3Rpb248UHJvZmlsZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFByb2ZpbGVMaXN0ZW5lcj4oKTsKLQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQl2b2lkIGFkZFByb2ZpbGVMaXN0ZW5lciggUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVycy5hZGQoIGxpc3RlbmVyKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIpOwotCQl9Ci0JCQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZCggSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9maWxlKCBkdHBQcm9maWxlKTsKLQkJCWZvciAoUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCQlsaXN0ZW5lci5wcm9maWxlQWRkZWQoIHByb2ZpbGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoIElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvZmlsZSggZHRwUHJvZmlsZSk7Ci0JCQlmb3IgKFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7Ci0JCQkJbGlzdGVuZXIucHJvZmlsZUNoYW5nZWQoIHByb2ZpbGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoIElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSBkdHBQcm9maWxlLmdldE5hbWUoKTsKLQkJCWZvciAoUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCQlsaXN0ZW5lci5wcm9maWxlRGVsZXRlZCggcHJvZmlsZU5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTA4MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuRHJpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuY29yZS5EYXRhYmFzZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmNvcmUucHJvZmlsZS5Qcm9maWxlVXRpbDsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBDb25uZWN0aW9uUHJvZmlsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGV4dGVuZHMgQ29ubmVjdGlvblByb2ZpbGUgewotCQotCWZpbmFsIHByaXZhdGUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGUgZHRwQ29ubmVjdGlvblByb2ZpbGU7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9UWVBFID0gImphdmEuc3FsLkNvbm5lY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fUFJPRklMRV9UWVBFID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy5jb25uZWN0aW9uUHJvZmlsZSI7ICAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfUFJPRFVDVF9QUk9QRVJUWSA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNlcnZlci52ZXJzaW9uIjsgIC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gQ29ubmVjdGlvblByb2ZpbGUgY3JlYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfU0FWRV9QV0RfUFJPUF9JRCA9IElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuUFJPUF9QUkVGSVggKyAic2F2ZVBXRCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gQ29ubmVjdGlvblByb2ZpbGUgY3JlYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlckRlZmluaXRpb25JRCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgaW4gRHJpdmVyRGVmaW5pdGlvbiBjcmVhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfREVGSU5JVElPTl9UWVBFX1BST1BfSUQgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLmRlZm5UeXBlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBEcml2ZXJEZWZpbml0aW9uIGNyZWF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9KQVJfTElTVF9QUk9QX0lEID0gImphckxpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUR1JFU1FMX1ZFTkRPUiA9ICJwb3N0Z3JlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19TQ0hFTUEgPSAicHVibGljIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyKCBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgcHJvZmlsZVJlcG9zaXRvcnksIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENvbm5lY3Rpb25Qcm9maWxlKSB7Ci0JCXN1cGVyKCBwcm9maWxlUmVwb3NpdG9yeSk7Ci0JCXRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUgPSBkdHBDb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCi0JCXRoaXMuZ2V0UHJvZmlsZVJlcG9zaXRvcnkoKS5hZGRQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9maWxlTGlzdGVuZXIoIFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKLQkJdGhpcy5nZXRQcm9maWxlUmVwb3NpdG9yeSgpLnJlbW92ZVByb2ZpbGVMaXN0ZW5lciggbGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKLQkJdGhpcy5nZXRDb25uZWN0aW9uKCkuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQl0aGlzLmdldENvbm5lY3Rpb24oKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBJTWFuYWdlZENvbm5lY3Rpb24gYnVpbGREdHBNYW5hZ2VkQ29ubmVjdGlvbiggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQlyZXR1cm4gZHRwUHJvZmlsZS5nZXRNYW5hZ2VkQ29ubmVjdGlvbiggQ09OTkVDVElPTl9UWVBFKTsKLQl9Ci0JLyoqCi0JICogQ29ubmVjdCB1c2luZyB0aGlzIHByb2ZpbGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLQkJaWYoICF0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmlzQ29ubmVjdGVkKCkpIHsKLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJCWlmKCAhc3RhdHVzLmlzT0soKSkgewotCQkJCWlmKCBzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJCUlTdGF0dXNbXSBzdGF0dXNDaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggc3RhdHVzQ2hpbGRyZW5bIDBdLmdldE1lc3NhZ2UoKSwgc3RhdHVzQ2hpbGRyZW5bIDBdLmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWlmKCAhc3RhdHVzLmlzT0soKSkgewotCQkJaWYoIHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCQlJU3RhdHVzW10gc3RhdHVzQ2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggc3RhdHVzQ2hpbGRyZW5bIDBdLmdldE1lc3NhZ2UoKSwgc3RhdHVzQ2hpbGRyZW5bIDBdLmdldEV4Y2VwdGlvbigpKTsKLQkJCX0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQl0aGlzLmdldENvbm5lY3Rpb24oKS5kYXRhYmFzZUNoYW5nZWQoIGRhdGFiYXNlLCBldmVudFR5cGUpOwotCQlyZXR1cm47Ci0JfQotCQotCUBPdmVycmlkZQotCSB2b2lkIGNhdGFsb2dDaGFuZ2VkKCBDYXRhbG9nIGNhdGFsb2csIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCSAvL1RPRE8KLS8vCQl0aGlzLmdldENvbm5lY3Rpb24oKS5jYXRhbG9nQ2hhbmdlZCggY2F0YWxvZywgZXZlbnRUeXBlKTsKLQkJIHJldHVybjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0Jdm9pZCBzY2hlbWFDaGFuZ2VkKCBTY2hlbWEgc2NoZW1hLCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQl0aGlzLmdldENvbm5lY3Rpb24oKS5zY2hlbWFDaGFuZ2VkKCBzY2hlbWEsIGRhdGFiYXNlLCBldmVudFR5cGUpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0Jdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCBTY2hlbWEgc2NoZW1hLCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQl0aGlzLmdldENvbm5lY3Rpb24oKS50YWJsZUNoYW5nZWQoIHRhYmxlLCBzY2hlbWEsIGRhdGFiYXNlLCBldmVudFR5cGUpOwotCX0KLQkJCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotCi0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb24oKS5pc0Nvbm5lY3RlZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc051bGwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCi0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCBEQVRBQkFTRV9QUk9EVUNUX1BST1BFUlRZKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRVJTSU9OX1BST1BfSUQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJaWYoIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRWZW5kb3IoKS5lcXVhbHNJZ25vcmVDYXNlKCBQT1NUR1JFU1FMX1ZFTkRPUikpIHsKLQkJCXJldHVybiBQVUJMSUNfU0NIRU1BOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldFVzZXJOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZUlkKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRJbnN0YW5jZUlEKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlcklkKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRQcm92aWRlcklkKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSggRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLkRSSVZFUl9ERUZJTklUSU9OX1BST1BfSUQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuIERyaXZlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREcml2ZXJJbnN0YW5jZUJ5SUQoIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklkKCkpLmdldEphckxpc3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldEJhc2VQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb25uZWN0aW9uIGJ1aWxkQ29ubmVjdGlvbigpIHsKLQotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmNyZWF0ZUNvbm5lY3Rpb24oIHRoaXMuYnVpbGREdHBNYW5hZ2VkQ29ubmVjdGlvbiggdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZSkpOyAgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29ubmVjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGF0YWJhc2UgYnVpbGREYXRhYmFzZSgpIHsKLQkJCi0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBkdHBEYXRhYmFzZTsKLQkJaWYoIHRoaXMuaXNDb25uZWN0ZWQoKSkgewotCQkJLy9UT0RPIHNlZSBEVFAgYnVnIDIwMjMwNgotCQkJLy9wYXNzIGNvbm5lY3Q9dHJ1ZSBpbiB0byBQcm9maWxlVXRpbC5nZXREYXRhYmFzZSgpCi0JCQkvL3RoZXJlIGlzIGEgYnVnIG1lbnRpb25lZCBpbiBhIGNvbW1lbnQ6IAotICAgICAgICAgICAgLy8gICAgICJkdXJpbmcgdGhlIHByb2ZpbGUgY29ubmVjdGVkIGV2ZW50IG5vdGlmaWNhdGlvbiwgCi0gICAgICAgICAgICAvLyAgICAgSU1hbmFnZWRDb25uZWN0aW9uIGlzIGNvbm5lY3RlZCB3aGlsZSBJQ29ubmVjdGlvblByb2ZpbGUgaXMgbm90IgotCQkJLy9zbyBzb21lIGhhY2tlcnkgaGVyZSBmb3IgdGhlaXIgaGFja2VyeQotCQkJZHRwRGF0YWJhc2UgPSBQcm9maWxlVXRpbC5nZXREYXRhYmFzZSggbmV3IERhdGFiYXNlSWRlbnRpZmllciggdGhpcy5nZXROYW1lKCksIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpLCB0cnVlKTsKLQkJCXJldHVybiBEYXRhYmFzZS5jcmVhdGVEYXRhYmFzZSggdGhpcywgZHRwRGF0YWJhc2UpOwotCQl9Ci0JCXJldHVybiBOdWxsRGF0YWJhc2UuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiB3cmFwcyggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZSA9PSBkdHBQcm9maWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvbldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDBiMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LkNvbm5lY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENvbm5lY3Rpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25XcmFwcGVyIGV4dGVuZHMgQ29ubmVjdGlvbiB7Ci0JCi0JZmluYWwgcHJpdmF0ZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbiBkdHBDb25uZWN0aW9uOwotCXByaXZhdGUgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCURUUENvbm5lY3Rpb25XcmFwcGVyKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbiBkdHBDb25uZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZHRwQ29ubmVjdGlvbiA9IGR0cENvbm5lY3Rpb247Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gbmV3IExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuZHRwQ29ubmVjdGlvbi5hZGRDb25uZWN0aW9uTGlzdGVuZXIoIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5kdHBDb25uZWN0aW9uLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uLmdldENvbm5lY3Rpb24oKS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvbi5nZXRGYWN0b3J5SUQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGRhdGFiYXNlQ2hhbmdlZCggRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZCggZGF0YWJhc2UsIGV2ZW50VHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnNjaGVtYUNoYW5nZWQoIHNjaGVtYSwgZGF0YWJhc2UsIGV2ZW50VHlwZSk7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQl2b2lkIHRhYmxlQ2hhbmdlZCggVGFibGUgdGFibGUsIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCQotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci50YWJsZUNoYW5nZWQoIHRhYmxlLCBzY2hlbWEsIGRhdGFiYXNlLCBldmVudFR5cGUpOwotCX0KLQkJCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gaG9vayB1cCB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIG91ciBpbnRlcm1lZGlhdGUgbGlzdGVuZXJzCi0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmFkZENvbm5lY3Rpb25MaXN0ZW5lciggbGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JfQotCQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5lciB0cmFuc2xhdGVzIGFuZCBmb3J3YXJkcyBJTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lciBldmVudHMgdG8gQ29ubmVjdGlvbkxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIgewotCQlwcml2YXRlIENvbGxlY3Rpb248Q29ubmVjdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PENvbm5lY3Rpb25MaXN0ZW5lcj4oKTsKLQotCQlMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQl2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVycy5hZGQoIGxpc3RlbmVyKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoIENvbm5lY3RFdmVudCBldmVudCkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLmFib3V0VG9DbG9zZSggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoIENvbm5lY3RFdmVudCBldmVudCkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLmNsb3NlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZmllZCggQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7Ci0JCQkJbGlzdGVuZXIubW9kaWZpZWQoIERUUENvbm5lY3Rpb25XcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKCBDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCQlpZiggIWxpc3RlbmVyLm9rVG9DbG9zZSggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoIENvbm5lY3RFdmVudCBldmVudCkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLm9wZW5lZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcywgZGF0YWJhc2UpOwotCQkJfQotCQl9Ci0JCQotCQl2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7Ci0JCQkJbGlzdGVuZXIuc2NoZW1hQ2hhbmdlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcywgc2NoZW1hKTsKLQkJCX0KLQkJfQotCQkKLQkJdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCBTY2hlbWEgc2NoZW1hLCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLnRhYmxlQ2hhbmdlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcywgdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIxZGFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgRGF0YWJhc2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUUERhdGFiYXNlV3JhcHBlciBleHRlbmRzIERhdGFiYXNlIHsKLQkKLQlmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlOwotCWZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBkdHBEYXRhYmFzZTsKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgZGF0YWJhc2VMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIFNldDxDYXRhbG9nPiBjYXRhbG9nczsgIC8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIFNldDxTY2hlbWE+IHNjaGVtYXRhOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCi0JRFRQRGF0YWJhc2VXcmFwcGVyKCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZHRwRGF0YWJhc2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kdHBEYXRhYmFzZSA9IGR0cERhdGFiYXNlOwotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkKLQkJaWYoIHRoaXMuY29ubmVjdGlvbklzT25saW5lKCkpIHsKLQkJCXRoaXMuZGF0YWJhc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGREYXRhYmFzZUxpc3RlbmVyKCk7Ci0JCQl0aGlzLmFkZENhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cERhdGFiYXNlLCB0aGlzLmRhdGFiYXNlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc09ubGluZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvZmlsZS5pc0Nvbm5lY3RlZCgpOwotCX0KLQkKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGREYXRhYmFzZUxpc3RlbmVyKCkgewotCSAgIHJldHVybiBuZXcgSUNhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKLQkJICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoIGZpbmFsIElDYXRhbG9nT2JqZWN0IGRhdGFiYXNlLCBmaW5hbCBpbnQgZXZlbnRUeXBlKSB7ICAgICAKLQkJCQlpZiggZGF0YWJhc2UgPT0gRFRQRGF0YWJhc2VXcmFwcGVyLnRoaXMuZHRwRGF0YWJhc2UpIHsJCi0JCQkJCURUUERhdGFiYXNlV3JhcHBlci50aGlzLnJlZnJlc2goKTsKLQkJCQkJRFRQRGF0YWJhc2VXcmFwcGVyLnRoaXMucHJvZmlsZS5kYXRhYmFzZUNoYW5nZWQoIERUUERhdGFiYXNlV3JhcHBlci50aGlzLCBldmVudFR5cGUpOwotCQkJCX0KLQkJICAgIH0KLQkgICAgfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHJlZnJlc2goKSB7Ci0JCXRoaXMuZGlzcG9zZVNjaGVtYXRhKCk7Ci0JCXRoaXMuZGlzcG9zZUNhdGFsb2dzKCk7Ci0JCQotCQl0aGlzLnNjaGVtYXRhID0gbnVsbDsKLQkJdGhpcy5jYXRhbG9ncyA9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgY2F0YWxvZ0NoYW5nZWQoIENhdGFsb2cgY2F0YWxvZywgaW50IGV2ZW50VHlwZSkgewotCQl0aGlzLnByb2ZpbGUuY2F0YWxvZ0NoYW5nZWQoIGNhdGFsb2csIHRoaXMsIGV2ZW50VHlwZSk7Ci0JCXJldHVybjsKLQl9CQotCQkKLQlAT3ZlcnJpZGUKLQl2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIGludCBldmVudFR5cGUpIHsKLQkJdGhpcy5wcm9maWxlLnNjaGVtYUNoYW5nZWQoIHNjaGVtYSwgdGhpcywgZXZlbnRUeXBlKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgIFNjaGVtYSBzY2hlbWEsIGludCBldmVudFR5cGUpIHsKLQkJdGhpcy5wcm9maWxlLnRhYmxlQ2hhbmdlZCggdGFibGUsIHNjaGVtYSwgdGhpcywgZXZlbnRUeXBlKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnJlbW92ZUNhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cERhdGFiYXNlLCB0aGlzLmRhdGFiYXNlTGlzdGVuZXIpOwotCi0JCXRoaXMuZGlzcG9zZVNjaGVtYXRhKCk7Ci0JCXRoaXMuZGlzcG9zZUNhdGFsb2dzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTY2hlbWF0YSgpIHsKLQkJaWYoIHRoaXMuc2NoZW1hdGEgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxTY2hlbWE+IHN0cmVhbSA9IHRoaXMuc2NoZW1hdGEoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJc3RyZWFtLm5leHQoKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDYXRhbG9ncygpIHsKLQkJaWYoIHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxDYXRhbG9nPiBzdHJlYW0gPSB0aGlzLmNhdGFsb2dzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCi0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlLmdldFZlcnNpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc2NoZW1hdGEKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCBTZXQ8U2NoZW1hPiBnZXRTY2hlbWF0YSgpIHsKLQkJaWYoIHRoaXMuc2NoZW1hdGEgPT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWF0YSA9IHRoaXMuYnVpbGRTY2hlbWF0YSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNjaGVtYXRhOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlLmdldFNjaGVtYXMoKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTY2hlbWE+IGJ1aWxkU2NoZW1hdGEoKSB7Ci0JCVNldDxTY2hlbWE+IHJlc3VsdDsKLQkJaWYoIHRoaXMuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLmdldFNjaGVtYXRhRm9yQ2F0YWxvZ05hbWVkKCB0aGlzLnByb2ZpbGUuZ2V0Q2F0YWxvZ05hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBkdHBTY2hlbWF0YSA9IHRoaXMuZHRwU2NoZW1hdGEoKTsKLQkJCXJlc3VsdCA9IG5ldyBIYXNoU2V0PFNjaGVtYT4oIGR0cFNjaGVtYXRhLnNpemUoKSk7Ci0JCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hIDogZHRwU2NoZW1hdGEpIHsKLQkJCQlyZXN1bHQuYWRkKCB0aGlzLndyYXAoZHRwU2NoZW1hKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLy8gKioqKiogY2F0YWxvZ3MKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCUVMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGR0cFNjaGVtYXRhID0gdGhpcy5kdHBTY2hlbWF0YSgpOwotCQlyZXR1cm4gKCBkdHBTY2hlbWF0YSA9PSBudWxsIHx8IGR0cFNjaGVtYXRhLnNpemUoKSA9PSAwKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBkdHBDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nTmFtZSgpIHsKLQkJCi0JCWlmKCAhdGhpcy5zdXBwb3J0c0NhdGFsb2dzKCkpIHsJLy8gdGhpcyBkYXRhYmFzZSBkb2Vzbid0IHN1cHBvcnQgY2F0YWxvZ3MKLQkJCXJldHVybiAiIjsKLQkJfQotCQlTdHJpbmcgdXNlck5hbWUgPSB0aGlzLnByb2ZpbGUuZ2V0VXNlck5hbWUoKTsKLQkJZm9yIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nIDogdGhpcy5kdHBDYXRhbG9ncygpKSB7Ci0JCQlpZiggZHRwQ2F0YWxvZy5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewkvLyBzcGVjaWFsIGNhdGFsb2cgdGhhdCBjb250YWlucyBhbGwgc2NoZW1hdGEKLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCQllbHNlIGlmKCBkdHBDYXRhbG9nLmdldE5hbWUoKS5lcXVhbHMoIHVzZXJOYW1lKSkgewotCQkJCXJldHVybiB1c2VyTmFtZTsJCS8vIHJldHVybnMgdXNlciBuYW1lIGFzIGRlZmF1bHQgY2F0YWxvZwotCQkJfQotCQkJZWxzZSBpZiggZHRwQ2F0YWxvZy5nZXROYW1lKCkuZXF1YWxzKCB0aGlzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7CQkgLy8gc3BlY2lhbCBjYXRhbG9nIHdpdGggc2FtZSBuYW1lIGFzIERCIChQb3N0Z3JlU1FMKQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCBTZXQ8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKSB7Ci0JCWlmKCB0aGlzLmNhdGFsb2dzID09IG51bGwpIHsKLQkJCXRoaXMuY2F0YWxvZ3MgPSB0aGlzLmJ1aWxkQ2F0YWxvZ3MoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jYXRhbG9nczsKLQl9Ci0KLQlwcml2YXRlIFNldDxDYXRhbG9nPiBidWlsZENhdGFsb2dzKCkgewotCQkKLQkJRUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGR0cENhdGFsb2dzID0gdGhpcy5kdHBDYXRhbG9ncygpOwotCQlpZiggZHRwQ2F0YWxvZ3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJU2V0PENhdGFsb2c+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PENhdGFsb2c+KCBkdHBDYXRhbG9ncy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cgOiBkdHBDYXRhbG9ncykgewotCQkJcmVzdWx0LmFkZCggdGhpcy53cmFwKGR0cENhdGFsb2cpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIFNldDxTY2hlbWE+IGdldFNjaGVtYXRhRm9yQ2F0YWxvZ05hbWVkKCBTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQotCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmNhdGFsb2dOYW1lZCggY2F0YWxvZ05hbWUpOwotCQlyZXR1cm4gKCBjYXRhbG9nICE9IG51bGwpID8gY2F0YWxvZy5idWlsZFNjaGVtYXRhKCkgOiBDb2xsZWN0aW9ucy48U2NoZW1hPmVtcHR5U2V0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDZlZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkpEQkNUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5KREJDVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5KYXZhVHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIEVjbGlwc2UgRFRQLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRQVG9vbHMgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFByaW1pdGl2ZSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3JQcmltaXRpdmVUeXBlTmFtZWQoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lKSB7Ci0JCVByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nIG1hcHBpbmcgPSBwcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyhwcmltaXRpdmVUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkRCQ19UWVBFIDogbWFwcGluZy5nZXRKREJDVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSkgewotCQlyZXR1cm4gamRiY1R5cGVGb3JQcmltaXRpdmVUeXBlTmFtZWQocHJpbWl0aXZlVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yUHJpbWl0aXZlVHlwZUNvZGUoaW50IHByaW1pdGl2ZVR5cGVDb2RlKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvcihQcmltaXRpdmVUeXBlLmdldChwcmltaXRpdmVUeXBlQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9yUHJpbWl0aXZlVHlwZU5hbWVkKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSkgewotCQlyZXR1cm4gSkRCQ1Rvb2xzLmphdmFUeXBlRm9yKGpkYmNUeXBlRm9yUHJpbWl0aXZlVHlwZU5hbWVkKHByaW1pdGl2ZVR5cGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFByaW1pdGl2ZSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3IoUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlKSB7Ci0JCXJldHVybiBKREJDVG9vbHMuamF2YVR5cGVGb3IoamRiY1R5cGVGb3IocHJpbWl0aXZlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9yUHJpbWl0aXZlVHlwZUNvZGUoaW50IHByaW1pdGl2ZVR5cGVDb2RlKSB7Ci0JCXJldHVybiBKREJDVG9vbHMuamF2YVR5cGVGb3IoamRiY1R5cGVGb3JQcmltaXRpdmVUeXBlQ29kZShwcmltaXRpdmVUeXBlQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUHJpbWl0aXZlIHR5cGUgaXMgYSBMT0IKLQkgKiAoaS5lLiBhIEJMT0IsIENMT0IsIG9yIE5DTE9CKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGF0YVR5cGVJc0xvYihQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUpIHsKLQkJcmV0dXJuIChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQklOQVJZX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuTkFUSU9OQUxfQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgc3R1ZmYgKioqKioqKioqKgotCi0KLQkvLyAqKioqKioqKioqIERUUCBQcmltaXRpdmUgPT4gSkRCQyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQcmltaXRpdmUgPT4gSkRCQyB0eXBlIG1hcHBpbmdzLCBrZXllZCBieSBQcmltaXRpdmUgdHlwZSBuYW1lIChlLmcuICJDSEFSQUNURVJfVkFSWUlORyIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nPiBQUklNSVRJVkVfVE9fSkRCQ19UWVBFX01BUFBJTkdTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSkRCQ1R5cGUgREVGQVVMVF9KREJDX1RZUEUgPSBKREJDVHlwZS50eXBlKFR5cGVzLlZBUkNIQVIpOyAgLy8gVE9ETyBWQVJDSEFSIGlzIHRoZSBkZWZhdWx0PwotCi0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyBwcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyhTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUpIHsKLQkJcmV0dXJuIHByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChwcmltaXRpdmVUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZz4gcHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoUFJJTUlUSVZFX1RPX0pEQkNfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlQUklNSVRJVkVfVE9fSkRCQ19UWVBFX01BUFBJTkdTID0gYnVpbGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gUFJJTUlUSVZFX1RPX0pEQkNfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmc+IGJ1aWxkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZz4oKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIERUUCBwcmltaXRpdmUgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlczsKLQkgKiBwcmV0dHkgbXVjaCBhIHN0cmFpZ2h0IG9uZS10by1vbmUgbWFwcGluZyBiYXNlZCBvbiBzaW1pbGFyIG5hbWVzOwotCSAqIFRPRE8gc29tZSBKREJDIHR5cGVzIGFyZSBtaXNzaW5nOiBJTlRFUlZBTCwgWE1MX1RZUEUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZz4gbWFwcGluZ3MpIHsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkJJR0lOVF9MSVRFUkFMLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkJJTkFSWV9MQVJHRV9PQkpFQ1RfTElURVJBTCwgVHlwZXMuQkxPQiwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuQklOQVJZX0xJVEVSQUwsIFR5cGVzLkJJTkFSWSwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuQklOQVJZX1ZBUllJTkdfTElURVJBTCwgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5CT09MRUFOX0xJVEVSQUwsIFR5cGVzLkJPT0xFQU4sIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkNIQVJBQ1RFUl9MQVJHRV9PQkpFQ1RfTElURVJBTCwgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuQ0hBUkFDVEVSX0xJVEVSQUwsIFR5cGVzLkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkNIQVJBQ1RFUl9WQVJZSU5HX0xJVEVSQUwsIFR5cGVzLlZBUkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkRBVEFMSU5LX0xJVEVSQUwsIFR5cGVzLkRBVEFMSU5LLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5EQVRFX0xJVEVSQUwsIFR5cGVzLkRBVEUsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkRFQ0lNQUxfTElURVJBTCwgVHlwZXMuREVDSU1BTCwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuRE9VQkxFX1BSRUNJU0lPTl9MSVRFUkFMLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkZMT0FUX0xJVEVSQUwsIFR5cGVzLkZMT0FULCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5JTlRFR0VSX0xJVEVSQUwsIFR5cGVzLklOVEVHRVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLklOVEVSVkFMX0xJVEVSQUwsIFR5cGVzLk9USEVSLCBtYXBwaW5ncyk7ICAvLyA/Pz8KLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLk5BVElPTkFMX0NIQVJBQ1RFUl9MQVJHRV9PQkpFQ1RfTElURVJBTCwgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuTkFUSU9OQUxfQ0hBUkFDVEVSX0xJVEVSQUwsIFR5cGVzLkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLk5BVElPTkFMX0NIQVJBQ1RFUl9WQVJZSU5HX0xJVEVSQUwsIFR5cGVzLlZBUkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLk5VTUVSSUNfTElURVJBTCwgVHlwZXMuTlVNRVJJQywgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuUkVBTF9MSVRFUkFMLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5TTUFMTElOVF9MSVRFUkFMLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuVElNRV9MSVRFUkFMLCBUeXBlcy5USU1FLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5USU1FU1RBTVBfTElURVJBTCwgVHlwZXMuVElNRVNUQU1QLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5YTUxfVFlQRV9MSVRFUkFMLCBUeXBlcy5PVEhFUiwgbWFwcGluZ3MpOyAgLy8gPz8/Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSwgaW50IGpkYmNUeXBlQ29kZSwgSGFzaE1hcDxTdHJpbmcsIFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQlPYmplY3QgcHJldiA9IG1hcHBpbmdzLnB1dChwcmltaXRpdmVUeXBlLmdldE5hbWUoKSwgYnVpbGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyhwcmltaXRpdmVUeXBlLCBqZGJjVHlwZUNvZGUpKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIEphdmEgY2xhc3M6ICIgKyAoKFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nKSBwcmV2KS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nIGJ1aWxkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmcoUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlLCBpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBuZXcgUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmcocHJpbWl0aXZlVHlwZSwgSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIERUUFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUHJpbWl0aXZlID0+IEpEQkMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyB7Ci0JCXByaXZhdGUgZmluYWwgUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlOwotCQlwcml2YXRlIGZpbmFsIEpEQkNUeXBlIGpkYmNUeXBlOwotCi0JCVByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSwgSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByaW1pdGl2ZVR5cGUgPSBwcmltaXRpdmVUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIFByaW1pdGl2ZVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLnByaW1pdGl2ZVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoUHJpbWl0aXZlVHlwZSBwdCkgewotCQkJcmV0dXJuIHRoaXMucHJpbWl0aXZlVHlwZS5lcXVhbHMocHQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUpIHsKLQkJCXJldHVybiB0aGlzLnByaW1pdGl2ZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhwcmltaXRpdmVUeXBlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKGludCBwcmltaXRpdmVUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMucHJpbWl0aXZlVHlwZS5nZXRWYWx1ZSgpID09IHByaW1pdGl2ZVR5cGVDb2RlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5wcmltaXRpdmVUeXBlLmdldE5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoIiA9PiAiKTsKLQkJCXRoaXMuamRiY1R5cGUuYXBwZW5kVG8oc2IpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU5ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5SZWZyZXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiAgRGF0YVRvb2xzIFdyYXBwZXIgYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUUFdyYXBwZXIgewotCQotCURUUFdyYXBwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjb25uZWN0aW9uSXNPbmxpbmUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZENhdGFsb2dPYmplY3RMaXN0ZW5lciggSUNhdGFsb2dPYmplY3QgY2F0YWxvZ09iamVjdCwgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBjYXRhbG9nT2JqZWN0TGlzdGVuZXIpIHsKLQkJaWYoIHRoaXMuY29ubmVjdGlvbklzT25saW5lKCkpIHsKLQkJCVJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkuQWRkTGlzdGVuZXIoIGNhdGFsb2dPYmplY3QsIGNhdGFsb2dPYmplY3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoIElDYXRhbG9nT2JqZWN0IGNhdGFsb2dPYmplY3QsIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgY2F0YWxvZ09iamVjdExpc3RlbmVyKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JICAgICAgICBSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKCBjYXRhbG9nT2JqZWN0LCBjYXRhbG9nT2JqZWN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKCB0aGlzLCB0aGlzLmdldE5hbWUoKSk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3ZjU2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EYXRhYmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogIERhdGFiYXNlIHdyYXBwZXIgYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFiYXNlIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8RGF0YWJhc2U+IHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOyAgLy8gVE9ETyBhbGxvdyB1c2VyIHRvIGNvbmZpZ3VyZQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0Jc3RhdGljIERhdGFiYXNlIGNyZWF0ZURhdGFiYXNlKCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZHRwRGF0YWJhc2UpIHsKLQkJcmV0dXJuICggZHRwRGF0YWJhc2UgPT0gbnVsbCkgPyBOdWxsRGF0YWJhc2UuaW5zdGFuY2UoKSA6IG5ldyBEVFBEYXRhYmFzZVdyYXBwZXIoIHByb2ZpbGUsIGR0cERhdGFiYXNlKTsKLQl9Ci0KLQlEYXRhYmFzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCWFic3RyYWN0IHZvaWQgY2F0YWxvZ0NoYW5nZWQoIENhdGFsb2cgY2F0YWxvZywgaW50IGV2ZW50VHlwZSk7Ci0KLQlhYnN0cmFjdCB2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIGludCBldmVudFR5cGUpOwotCi0JYWJzdHJhY3Qgdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCAgU2NoZW1hIHNjaGVtYSwgaW50IGV2ZW50VHlwZSk7Ci0JCi0JYWJzdHJhY3Qgdm9pZCByZWZyZXNoKCk7Ci0JCi0JcHJvdGVjdGVkIFNjaGVtYSB3cmFwKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gbmV3IFNjaGVtYSggdGhpcywgc2NoZW1hKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENhdGFsb2cgd3JhcCggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gbmV3IENhdGFsb2coIHRoaXMsIGNhdGFsb2cpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWZW5kb3IoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIGR0cCBjb2x1bW4KLQkgKi8KLQlDb2x1bW4gY29sdW1uKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy50YWJsZSggZHRwQ29sdW1uLmdldFRhYmxlKCkpLmNvbHVtbiggZHRwQ29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBkdHAgdGFibGUKLQkgKi8KLQlUYWJsZSB0YWJsZSggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYSggZHRwVGFibGUuZ2V0U2NoZW1hKCkpLnRhYmxlKCBkdHBUYWJsZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKCB0aGlzLmdldE5hbWUoKSwgZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLyAqKioqKiBjYXNlU2Vuc2l0aXZlCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZSggYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLy8gKioqKiogY2F0YWxvZ3MKLQotCWFic3RyYWN0IFNldDxDYXRhbG9nPiBnZXRDYXRhbG9ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGF0YWJhc2UgYWNjZXB0cyBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2F0YWxvZyB0byB1c2UgYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nTmFtZSgpOwotCQotCXB1YmxpYyBJdGVyYXRvcjxDYXRhbG9nPiBjYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ3MoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgY2F0YWxvZ1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2dzKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhdGFsb2dOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPENhdGFsb2csIFN0cmluZz4oIHRoaXMuY2F0YWxvZ3MoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybSggQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQkJIHJldHVybiBjYXRhbG9nLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0NhdGFsb2dOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2F0YWxvZ05hbWVkKCBuYW1lKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBDYXRhbG9nIGNhdGFsb2dOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPyB0aGlzLmNhdGFsb2dOYW1lZEludGVybmFsKCBuYW1lKSA6IHRoaXMuY2F0YWxvZ05hbWVkSWdub3JlQ2FzZSggbmFtZSk7Ci0JfQotCQotCXByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nTmFtZWRJbnRlcm5hbCggU3RyaW5nIG5hbWUpIHsKLQkJZm9yICggSXRlcmF0b3I8Q2F0YWxvZz4gc3RyZWFtID0gdGhpcy5jYXRhbG9ncygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNhdGFsb2cgY2F0YWxvZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoIGNhdGFsb2cuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSkpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDYXRhbG9nIGNhdGFsb2dOYW1lZElnbm9yZUNhc2UoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPENhdGFsb2c+IHN0cmVhbSA9IHRoaXMuY2F0YWxvZ3MoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDYXRhbG9nIGNhdGFsb2cgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCBjYXRhbG9nLmdldE5hbWUoKSwgbmFtZSkpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNhdGFsb2cgZm9yIHRoZSBzcGVjaWZpZWQgZHRwIGNhdGFsb2cKLQkgKi8KLQlDYXRhbG9nIGNhdGFsb2coIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cpIHsKLQkJZm9yICggSXRlcmF0b3I8Q2F0YWxvZz4gc3RyZWFtID0gdGhpcy5jYXRhbG9ncygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNhdGFsb2cgY2F0YWxvZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoY2F0YWxvZy53cmFwcyggZHRwQ2F0YWxvZykpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaW52YWxpZCBkdHAgY2F0YWxvZzogIiArIGR0cENhdGFsb2cpOwotCX0KLQotCi0JLy8gKioqKiogc2NoZW1hdGEKLQotCWFic3RyYWN0IFNldDxTY2hlbWE+IGdldFNjaGVtYXRhKCk7Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U2NoZW1hPiBzY2hlbWF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hdGEoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgc2NoZW1hdGFTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWF0YSgpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWF0YUNvbnRhaW5zKCBDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYXRhKCkuY29udGFpbnMoIGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gc2NoZW1hTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTY2hlbWEsIFN0cmluZz4oIHRoaXMuc2NoZW1hdGEoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybSggU2NoZW1hIHNjaGVtYSkgewotCQkJCSByZXR1cm4gc2NoZW1hLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NjaGVtYU5hbWVkKCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFOYW1lZCggbmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIHNjaGVtYU5hbWVkKCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0Nhc2VTZW5zaXRpdmUoKSA/IHRoaXMuc2NoZW1hTmFtZWRJbnRlcm5hbCggbmFtZSkgOiB0aGlzLnNjaGVtYU5hbWVkSWdub3JlQ2FzZSggbmFtZSk7Ci0JfQotCQotCXByaXZhdGUgU2NoZW1hIHNjaGVtYU5hbWVkSW50ZXJuYWwoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPFNjaGVtYT4gc3RyZWFtID0gdGhpcy5zY2hlbWF0YSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBzY2hlbWEuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSkpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFNjaGVtYSBzY2hlbWFOYW1lZElnbm9yZUNhc2UoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPFNjaGVtYT4gc3RyZWFtID0gdGhpcy5zY2hlbWF0YSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCBzY2hlbWEuZ2V0TmFtZSgpLCBuYW1lKSkgewotCQkJCXJldHVybiBzY2hlbWE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBzY2hlbWEgZm9yIHRoZSBzcGVjaWZpZWQgZHRwIHNjaGVtYQotCSAqLwotCVNjaGVtYSBzY2hlbWEoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPFNjaGVtYT4gc3RyZWFtID0gdGhpcy5zY2hlbWF0YSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBzY2hlbWEud3JhcHMoIGR0cFNjaGVtYSkpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJpbnZhbGlkIGR0cCBzY2hlbWE6ICIgKyBkdHBTY2hlbWEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRm9yZWlnbktleS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRm9yZWlnbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmMwNTAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0ZvcmVpZ25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIEZvcmVpZ25LZXkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZvcmVpZ25LZXkgZXh0ZW5kcyBEVFBXcmFwcGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxGb3JlaWduS2V5PiB7Ci0JcHJpdmF0ZSBmaW5hbCBUYWJsZSBiYXNlVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGZvcmVpZ25LZXlMaXN0ZW5lcjsKLQotCXByaXZhdGUgVGFibGUgcmVmZXJlbmNlZFRhYmxlOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgU2V0PENvbHVtblBhaXI+IGNvbHVtblBhaXJzOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRFbnRpdHlGaWVsZE5hbWU7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRFbnRpdHlGaWVsZE5hbWVDYWxjdWxhdGVkID0gZmFsc2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCUZvcmVpZ25LZXkoVGFibGUgYmFzZVRhYmxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5iYXNlVGFibGUgPSBiYXNlVGFibGU7Ci0JCXRoaXMuZHRwRm9yZWlnbktleSA9IGR0cEZvcmVpZ25LZXk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JCQl0aGlzLmZvcmVpZ25LZXlMaXN0ZW5lciA9IHRoaXMuYnVpbGRGb3JlaWduS2V5TGlzdGVuZXIoKTsKLQkJCXRoaXMuYWRkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwRm9yZWlnbktleSwgdGhpcy5mb3JlaWduS2V5TGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc09ubGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVRhYmxlLmNvbm5lY3Rpb25Jc09ubGluZSgpOwotCX0KLQkKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGRGb3JlaWduS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotICAgIAkgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCggZmluYWwgSUNhdGFsb2dPYmplY3QgZm9yZWlnbktleSwgZmluYWwgaW50IGV2ZW50VHlwZSkgeyAKLS8vCQkJCVRPRE8KLS8vICAgIAkJCWlmKCBmb3JlaWduS2V5ID09IEZvcmVpZ25LZXkudGhpcy5kdHBGb3JlaWduS2V5KSB7CSAgICAJICAgIAkKLS8vICAgIAkJCQlGb3JlaWduS2V5LnRoaXMuYmFzZVRhYmxlLmZvcmVpZ25LZXlDaGFuZ2VkKCBGb3JlaWduS2V5LnRoaXMsIGV2ZW50VHlwZSk7Ci0vLyAgICAJCQl9Ci0gICAgCSAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJCi0JCXRoaXMucmVtb3ZlQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwRm9yZWlnbktleSwgdGhpcy5mb3JlaWduS2V5TGlzdGVuZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgVGFibGUgZ2V0QmFzZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5iYXNlVGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldE5hbWUoKTsKLQl9Ci0KLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVRhYmxlLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCX0KLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkgPT0gZm9yZWlnbktleTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSArICI6ICIgKyB0aGlzLmdldENvbHVtblBhaXJzKCkpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKSB7Ci0JCWlmICh0aGlzLnJlZmVyZW5jZWRUYWJsZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlZmVyZW5jZWRUYWJsZSA9IHRoaXMuYmFzZVRhYmxlLnRhYmxlKHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0QmFzZVRhYmxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgImJhc2UiIGNvbHVtbnMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uPiBiYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5jb2x1bW5QYWlycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtKENvbHVtblBhaXIgcGFpcikgewotCQkJCXJldHVybiBwYWlyLmdldEJhc2VDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgImJhc2UiIGNvbHVtbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YKLQkgKiB0aGUgYmFzZSB0YWJsZSdzIHByaW1hcnkga2V5Ci0JICovCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtbj4gbm9uUHJpbWFyeUtleUJhc2VDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbj4odGhpcy5iYXNlQ29sdW1ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbykgewotCQkJCXJldHVybiAhIEZvcmVpZ25LZXkudGhpcy5nZXRCYXNlVGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc0NvbnRhaW5zKChDb2x1bW4pIG8pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgY29sdW1ucwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IHJlZmVyZW5jZWRDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Q29sdW1uUGFpciwgQ29sdW1uPih0aGlzLmNvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oQ29sdW1uUGFpciBjb2x1bW5QYWlyKSB7Ci0JCQkJcmV0dXJuIGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2V0RGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpOwotCQlyZXR1cm4gKGZpZWxkTmFtZSA9PSBudWxsKSA/Ci0JCQl0aGlzLm5vbkRlZmF1bHRFbnRpdHlGaWVsZE5hbWUoKQotCQk6Ci0JCQlmaWVsZE5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlc0phdmFGaWVsZE5hbWUoU3RyaW5nIGphdmFGaWVsZE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPwotCQkJamF2YUZpZWxkTmFtZS5lcXVhbHModGhpcy5nZXREZWZhdWx0RW50aXR5RmllbGROYW1lKCkpCi0JCToKLQkJCWphdmFGaWVsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZSh0aGlzLmdldERlZmF1bHRFbnRpdHlGaWVsZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Rm9yKFN0cmluZyBqYXZhRmllbGROYW1lKSB7Ci0JCWlmICh0aGlzLmNvbHVtblBhaXJzU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICh0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUNvbHVtblBhaXIgY29sdW1uUGFpciA9IHRoaXMuY29sdW1uUGFpcnMoKS5uZXh0KCk7Ci0JCUNvbHVtbiBwa0NvbHVtbiA9IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKS5uZXh0KCk7Ci0JCWlmIChjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKSAhPSBwa0NvbHVtbikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLm1hdGNoZXNKYXZhRmllbGROYW1lKGphdmFGaWVsZE5hbWUgKyAiXyIgKyBwa0NvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKiogY29sdW1uIHBhaXJzCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uUGFpcj4gZ2V0Q29sdW1uUGFpcnMoKSB7Ci0JCWlmICh0aGlzLmNvbHVtblBhaXJzID09IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uUGFpcnMgPSB0aGlzLmJ1aWxkQ29sdW1uUGFpcnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW5QYWlyczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZHRwQmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkuZ2V0TWVtYmVycygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBkdHBSZWZDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldFVuaXF1ZUNvbnN0cmFpbnQoKS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8Q29sdW1uUGFpcj4gYnVpbGRDb2x1bW5QYWlycygpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBiYXNlQ29sdW1ucyA9IHRoaXMuZHRwQmFzZUNvbHVtbnMoKTsKLQkJaW50IHNpemUgPSBiYXNlQ29sdW1ucy5zaXplKCk7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gcmVmQ29sdW1ucyA9IHRoaXMuZHRwUmVmQ29sdW1ucygpOwotCQlpZiAocmVmQ29sdW1ucy5zaXplKCkgIT0gc2l6ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzbWF0Y2hlZCBzaXplczogIiArIHNpemUgKyAiIHZzLiAiICsgcmVmQ29sdW1ucy5zaXplKCkpOwotCQl9Ci0JCVNldDxDb2x1bW5QYWlyPiByZXN1bHQgPSBuZXcgSGFzaFNldDxDb2x1bW5QYWlyPihiYXNlQ29sdW1ucy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gYmFzZUNvbHVtbnMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCUNvbHVtbiBiYXNlQ29sdW1uID0gdGhpcy5iYXNlVGFibGUuY29sdW1uKGJhc2VDb2x1bW5zLmdldChpKSk7Ci0JCQlDb2x1bW4gcmVmQ29sdW1uID0gdGhpcy5iYXNlVGFibGUuY29sdW1uKHJlZkNvbHVtbnMuZ2V0KGkpKTsKLQkJCXJlc3VsdC5hZGQobmV3IENvbHVtblBhaXIoYmFzZUNvbHVtbiwgcmVmQ29sdW1uKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uUGFpcj4gY29sdW1uUGFpcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtblBhaXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uUGFpcnMoKS5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKiBkZWZhdWx0IGVudGl0eSBmaWVsZCBuYW1lCi0KLQkvKioKLQkgKiBJZiB0aGUgbmFtZSBvZiB0aGUgImJhc2UiIGNvbHVtbiBhZGhlcmVzIHRvIHRoZSBFSkIgc3RhbmRhcmQgZm9yIGEKLQkgKiBkZWZhdWx0IG1hcHBpbmcgKGkuZS4gaXQgZW5kcyB3aXRoIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUKLQkgKiBvZiB0aGUgInJlZmVyZW5jZWQiIGNvbHVtbiwgYW5kIHRoZSAicmVmZXJlbmNlZCIgY29sdW1uIGlzIHRoZSBzaW5nbGUKLQkgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlICJyZWZlcmVuY2VkIiB0YWJsZSksIHJldHVybiB0aGUgY29ycmVzcG9uZGluZwotCSAqIGRlZmF1bHQgZW50aXR5IGZpZWxkIG5hbWU6Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogUmV0dXJuIGEgbnVsbCBpZiBpdCBkb2VzIG5vdCBhZGhlcmUgdG8gdGhlIEVKQiBzdGFuZGFyZDoKLQkgKiAgICAgRm9yZWlnbktleShFTVAuQ1VCSUNMRV9JRCA9PiBDVUJJQ0xFLkNVQklDTEVfSUQpID0+IG51bGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0RW50aXR5RmllbGROYW1lKCkgewotCQlpZiAoICEgdGhpcy5kZWZhdWx0RW50aXR5RmllbGROYW1lQ2FsY3VsYXRlZCkgewotCQkJdGhpcy5kZWZhdWx0RW50aXR5RmllbGROYW1lQ2FsY3VsYXRlZCA9IHRydWU7Ci0JCQl0aGlzLmRlZmF1bHRFbnRpdHlGaWVsZE5hbWUgPSB0aGlzLmJ1aWxkRGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRFbnRpdHlGaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSAjZ2V0RGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0RW50aXR5RmllbGROYW1lKCkgewotCQlpZiAoICEgdGhpcy5yZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSB0aGlzLmNvbHVtblBhaXJzKCkubmV4dCgpOwotCQlTdHJpbmcgYmFzZUNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCVN0cmluZyByZWZDb2xOYW1lID0gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlpZiAoYmFzZUNvbE5hbWUubGVuZ3RoKCkgPD0gKHJlZkNvbE5hbWUubGVuZ3RoKCkgKyAxKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCAhIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgX2luZGV4ID0gYmFzZUNvbE5hbWUubGVuZ3RoKCkgLSByZWZDb2xOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGJhc2VDb2xOYW1lLmNoYXJBdChfaW5kZXgpICE9ICdfJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBiYXNlQ29sTmFtZS5zdWJzdHJpbmcoMCwgX2luZGV4KTsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPyBuYW1lIDogbmFtZS50b0xvd2VyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSByZWZlcmVuY2VzIHRoZSBwcmltYXJ5IGtleSBvZiB0aGUKLQkgKiAicmVmZXJlbmNlZCIgdGFibGUgYW5kIHRoYXQgcHJpbWFyeSBrZXkgaGFzIG9ubHkgYSBzaW5nbGUgY29sdW1uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkgewotCQlpZiAodGhpcy5jb2x1bW5QYWlyc1NpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5jb2x1bW5QYWlycygpLm5leHQoKTsKLQkJcmV0dXJuIGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpID09IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKS5uZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbXBsZSAoc2luZ2xlLWNvbHVtbikgZm9yZWlnbiBrZXksIHJldHVybiB0aGUgamF2YSBmaWVsZAotCSAqIG5hbWUgb2YgdGhlIHNpbmdsZSBiYXNlIGNvbHVtbi4gSWYgdGhpcyBpcyBhIGNvbXBvdW5kIGZvcmVpZ24ga2V5LAotCSAqIHJldHVybiB0aGUgamF2YSBmaWVsZCBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCS8vIFRPRE8gaWYgdGhlcmUgaXMgb25seSBvbmUgRksgdG8gYSBnaXZlbiB0YWJsZSwgdXNlIHRoZSB0YWJsZSdzIG5hbWUgaW5zdGVhZCBvZiB0aGUgY29sdW1uJ3MgbmFtZT8KLQkvLyBUT0RPIGlmIHRoZSBGSyBjb2x1bW4gbmFtZSBlbmRzIHdpdGggdGhlIFBLIGNvbHVtbiBuYW1lLCBzdHJpcCB0aGUgUEsgY29sdW1uIG5hbWU/Ci0JcHJpdmF0ZSBTdHJpbmcgbm9uRGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNvbHVtblBhaXJzU2l6ZSgpID09IDEpID8KLQkJCXRoaXMuY29sdW1uUGFpcnMoKS5uZXh0KCkuZ2V0QmFzZUNvbHVtbigpLmphdmFGaWVsZE5hbWUoKQotCQk6Ci0JCQl0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmphdmFGaWVsZE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLmdldE5hbWUoKSwgZm9yZWlnbktleS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb2x1bW5QYWlyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxDb2x1bW5QYWlyPiB7Ci0JCXByaXZhdGUgZmluYWwgQ29sdW1uIGJhc2VDb2x1bW47Ci0JCXByaXZhdGUgZmluYWwgQ29sdW1uIHJlZmVyZW5jZWRDb2x1bW47Ci0KLQkJQ29sdW1uUGFpcihDb2x1bW4gYmFzZUNvbHVtbiwgQ29sdW1uIHJlZmVyZW5jZWRDb2x1bW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uID0gcmVmZXJlbmNlZENvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBDb2x1bW4gZ2V0QmFzZUNvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLmJhc2VDb2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgQ29sdW1uIGdldFJlZmVyZW5jZWRDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBiYXNlQ29sdW1uLmdldE5hbWUoKSArICI9PiIgKyB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKENvbHVtblBhaXIgY3ApIHsKLQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpLCBjcC5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJfQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvSnB0RGJQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0pwdERiUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOWYyMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvSnB0RGJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IGNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKcHREYlBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdERiUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKcHREYlBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgPSBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuaW5zdGFuY2UoKTsKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuaW5pdGlhbGl6ZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LmRpc3Bvc2VMaXN0ZW5lcnMoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgPSBudWxsOwotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9OdWxsQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvTnVsbENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5NTYzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9OdWxsQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotCi0vKioKLSAqICBOdWxsQ29ubmVjdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbENvbm5lY3Rpb24gZXh0ZW5kcyBDb25uZWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIE51bGxDb25uZWN0aW9uIElOU1RBTkNFOwotCi0JLyoqCi0JICogc2luZ2xldG9uIHN1cHBvcnQKLQkgKi8KLQlzdGF0aWMgc3luY2hyb25pemVkIENvbm5lY3Rpb24gaW5zdGFuY2UoKSB7Ci0JCWlmKCBJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBOdWxsQ29ubmVjdGlvbigpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIE51bGxDb25uZWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QoIHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCSB2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JIHZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9OdWxsQ29ubmVjdGlvblByb2ZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL051bGxDb25uZWN0aW9uUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2EyZTU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL051bGxDb25uZWN0aW9uUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLkRyaXZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiAgTnVsbENvbm5lY3Rpb25Qcm9maWxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ29ubmVjdGlvblByb2ZpbGUgZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTnVsbENvbm5lY3Rpb25Qcm9maWxlIElOU1RBTkNFOwotCi0JLyoqCi0JICogc2luZ2xldG9uIHN1cHBvcnQKLQkgKi8KLQlzdGF0aWMgc3luY2hyb25pemVkIENvbm5lY3Rpb25Qcm9maWxlIGluc3RhbmNlKCkgewotCQlpZiggSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgTnVsbENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgTnVsbENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlzdXBlciggbnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBidWlsZENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBOdWxsQ29ubmVjdGlvbi5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEYXRhYmFzZSBidWlsZERhdGFiYXNlKCkgewotCQlyZXR1cm4gTnVsbERhdGFiYXNlLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCSB2b2lkIGNhdGFsb2dDaGFuZ2VkKCBDYXRhbG9nIGNhdGFsb2csIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JIHZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlAT3ZlcnJpZGUKLQkgdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCBTY2hlbWEgc2NoZW1hLCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gTnVsbENvbm5lY3Rpb24uaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiBOdWxsRGF0YWJhc2UuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCggdGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlSWQoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVySWQoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JZCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlib29sZWFuIHdyYXBzKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2ZpbGVMaXN0ZW5lciggUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL051bGxEYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvTnVsbERhdGFiYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzE2YjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvTnVsbERhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotCi0vKioKLSAqICBOdWxsRGF0YWJhc2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxEYXRhYmFzZSBleHRlbmRzIERhdGFiYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIE51bGxEYXRhYmFzZSBJTlNUQU5DRTsKLQotCS8qKgotCSAqIHNpbmdsZXRvbiBzdXBwb3J0Ci0JICovCi0Jc3RhdGljIHN5bmNocm9uaXplZCBEYXRhYmFzZSBpbnN0YW5jZSgpIHsKLQkJaWYoIElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IE51bGxEYXRhYmFzZSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIE51bGxEYXRhYmFzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQl2b2lkIGNhdGFsb2dDaGFuZ2VkKCBDYXRhbG9nIGNhdGFsb2csIGludCBldmVudFR5cGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCAgU2NoZW1hIHNjaGVtYSxpbnQgZXZlbnRUeXBlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0Jdm9pZCByZWZyZXNoKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QoIHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8vICoqKioqIGNhdGFsb2dzCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZ05hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTZXQ8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCX0KLQotCS8vICoqKioqIHNjaGVtYXRhCi0JCi0JQE92ZXJyaWRlCi0JU2V0PFNjaGVtYT4gZ2V0U2NoZW1hdGEoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1Byb2ZpbGVMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvUHJvZmlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3N2IzOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvUHJvZmlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotLyoqCi0gKiBQcm9maWxlTGlzdGVuZXIgaW50ZWdyYXRlIHRoIERUUCBJUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyLgotICogVGhpcyBjbGFzcyBwdXJwb3NlIGlzIHRvIGRlY291cGxlIGZyb20gdGhlIERUUCBsaXN0ZW5lcnMgYnkgYWNjZXB0aW5nIHdyYXBwZXJzIGFzIHBhcmFtZXRlci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9maWxlTGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9maWxlQWRkZWQoIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoIFN0cmluZyBwcm9maWxlTmFtZSk7Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHByb2ZpbGUgaGFzIGJlZW4gbW9kaWZpZWQuICBNb2RpZmljYXRpb24gaW5jbHVkZXMKLQkgKiBjaGFuZ2VzIHRvIGFueSBwcm9wZXJ0aWVzLCB0aGUgbmFtZSwgYXV0by1jb25uZWN0IGZsYWcsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZCggQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1NjaGVtYS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjJjN2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIFNjaGVtYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2NoZW1hIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8U2NoZW1hPiB7Ci0JZmluYWwgRGF0YWJhc2UgZGF0YWJhc2U7Ci0JZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWE7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIHNjaGVtYUxpc3RlbmVyOwotCQotCXByaXZhdGUgU2V0PFRhYmxlPiB0YWJsZXM7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBTZXQ8U2VxdWVuY2U+IHNlcXVlbmNlczsgIC8vIGxhenktaW5pdGlhbGl6ZWQKLQkKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCVNjaGVtYSggRGF0YWJhc2UgZGF0YWJhc2UsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQkJdGhpcy5kdHBTY2hlbWEgPSBkdHBTY2hlbWE7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JCQl0aGlzLnNjaGVtYUxpc3RlbmVyID0gdGhpcy5idWlsZFNjaGVtYUxpc3RlbmVyKCk7Ci0JCQl0aGlzLmFkZENhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cFNjaGVtYSwgdGhpcy5zY2hlbWFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9uSXNPbmxpbmUoKTsKLQl9Ci0KLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGRTY2hlbWFMaXN0ZW5lcigpIHsKLSAgICAgICByZXR1cm4gbmV3IElDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7Ci0gICAgCSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCBmaW5hbCBJQ2F0YWxvZ09iamVjdCBzY2hlbWEsIGZpbmFsIGludCBldmVudFR5cGUpIHsgICAgIAotICAgIAkJCWlmKCBzY2hlbWEgPT0gU2NoZW1hLnRoaXMuZHRwU2NoZW1hKSB7CQotICAgIAkJCQlTY2hlbWEudGhpcy5yZWZyZXNoKCk7Ci0gICAgCQkJCVNjaGVtYS50aGlzLmRhdGFiYXNlLnNjaGVtYUNoYW5nZWQoIFNjaGVtYS50aGlzLCBldmVudFR5cGUpOwotICAgIAkJCX0KLSAgICAJICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLQl2b2lkIHJlZnJlc2goKSB7Ci0JCXRoaXMuZGlzcG9zZVRhYmxlcygpOwotCQl0aGlzLmRpc3Bvc2VTZXF1ZW5jZXMoKTsKLQkJCi0JCXRoaXMudGFibGVzID0gbnVsbDsKLQkJdGhpcy5zZXF1ZW5jZXMgPSBudWxsOwotCX0KLQotCXZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgaW50IGV2ZW50VHlwZSkgewotCQl0aGlzLmRhdGFiYXNlLnRhYmxlQ2hhbmdlZCggdGFibGUsIHRoaXMsIGV2ZW50VHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSB3cmFwKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZSggdGhpcywgdGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2VxdWVuY2Ugd3JhcCggIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQlyZXR1cm4gbmV3IFNlcXVlbmNlKCB0aGlzLCBzZXF1ZW5jZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5yZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTY2hlbWEsIHRoaXMuc2NoZW1hTGlzdGVuZXIpOwotCi0JCXRoaXMuZGlzcG9zZVRhYmxlcygpOwotCQl0aGlzLmRpc3Bvc2VTZXF1ZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZVRhYmxlcygpIHsKLQkJaWYoIHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCWZvciggSXRlcmF0b3I8VGFibGU+IHN0cmVhbSA9IHRoaXMudGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTZXF1ZW5jZXMoKSB7Ci0JCWlmKCB0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQlmb3IoIEl0ZXJhdG9yPFNlcXVlbmNlPiBzdHJlYW0gPSB0aGlzLnNlcXVlbmNlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0TmFtZSgpOwotCX0KLQkKLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JfQotCi0JQ29sdW1uIGNvbHVtbiggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuY29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFRhYmxlPiBnZXRUYWJsZXMoKSB7Ci0JCWlmKCB0aGlzLnRhYmxlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlcyA9IHRoaXMuYnVpbGRUYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy50YWJsZXM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0VGFibGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8VGFibGU+IGJ1aWxkVGFibGVzKCkgewotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzID0gdGhpcy5kdHBUYWJsZXMoKTsKLQkJU2V0PFRhYmxlPiByZXN1bHQgPSBuZXcgSGFzaFNldDxUYWJsZT4oIGR0cFRhYmxlcy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSA6IGR0cFRhYmxlcykgewotCQkJcmVzdWx0LmFkZCggdGhpcy53cmFwKGR0cFRhYmxlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB0YWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZXMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVzQ29udGFpbnMoIENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVzKCkuY29udGFpbnMoIGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gdGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhYmxlLCBTdHJpbmc+KCB0aGlzLnRhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKCBUYWJsZSB0YWJsZSkgewotCQkJCSByZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVGFibGVOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVOYW1lZCggbmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgdGFibGVOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPyB0aGlzLnRhYmxlTmFtZWRJbnRlcm5hbCggbmFtZSkgOiB0aGlzLnRhYmxlTmFtZWRJZ25vcmVDYXNlKCBuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZU5hbWVkSW50ZXJuYWwoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciggSXRlcmF0b3I8VGFibGU+IHN0cmVhbSA9IHRoaXMudGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJVGFibGUgdGFibGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYoIHRhYmxlLmdldE5hbWUoKS5lcXVhbHMoIG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFRhYmxlIHRhYmxlTmFtZWRJZ25vcmVDYXNlKCBTdHJpbmcgbmFtZSkgewotCQlmb3IoIEl0ZXJhdG9yPFRhYmxlPiBzdHJlYW0gPSB0aGlzLnRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVRhYmxlIHRhYmxlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmKCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCB0YWJsZS5nZXROYW1lKCksIG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgZHRwIHRhYmxlCi0JICovCi0JVGFibGUgdGFibGUoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlpZiggZHRwVGFibGUuZ2V0U2NoZW1hKCkgIT0gdGhpcy5kdHBTY2hlbWEpIHsKLQkJCXJldHVybiB0aGlzLmRhdGFiYXNlLnRhYmxlKCBkdHBUYWJsZSk7Ci0JCX0KLQkJZm9yKCBJdGVyYXRvcjxUYWJsZT4gc3RyZWFtID0gdGhpcy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlUYWJsZSB0YWJsZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiggdGFibGUud3JhcHMoIGR0cFRhYmxlKSkgewotCQkJCXJldHVybiB0YWJsZTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaW52YWxpZCBEVFAgdGFibGU6ICIgKyBkdHBUYWJsZSk7Ci0JfQotCi0JLy8gKioqKiogc2VxdWVuY2VzCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFNlcXVlbmNlPiBnZXRTZXF1ZW5jZXMoKSB7Ci0JCWlmKCB0aGlzLnNlcXVlbmNlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnNlcXVlbmNlcyA9IHRoaXMuYnVpbGRTZXF1ZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZXM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZT4gZHRwU2VxdWVuY2VzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0U2VxdWVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8U2VxdWVuY2U+IGJ1aWxkU2VxdWVuY2VzKCkgewotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZT4gZHRwU2VxdWVuY2VzID0gdGhpcy5kdHBTZXF1ZW5jZXMoKTsKLQkJU2V0PFNlcXVlbmNlPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTZXF1ZW5jZT4oIGR0cFNlcXVlbmNlcy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZSBkdHBTZXF1ZW5jZSA6IGR0cFNlcXVlbmNlcykgewotCQkJcmVzdWx0LmFkZCggdGhpcy53cmFwKGR0cFNlcXVlbmNlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U2VxdWVuY2U+IHNlcXVlbmNlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VxdWVuY2VzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNlcXVlbmNlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNlcXVlbmNlcygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXF1ZW5jZXNDb250YWlucyggQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRTZXF1ZW5jZXMoKS5jb250YWlucyggY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBzZXF1ZW5jZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U2VxdWVuY2UsIFN0cmluZz4odGhpcy5zZXF1ZW5jZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybSggU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJCQkgcmV0dXJuIHNlcXVlbmNlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NlcXVlbmNlTmFtZWQoIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZWQoIG5hbWUpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFNlcXVlbmNlIHNlcXVlbmNlTmFtZWQoIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSgpID8gdGhpcy5zZXF1ZW5jZU5hbWVkSW50ZXJuYWwoIG5hbWUpIDogdGhpcy5zZXF1ZW5jZU5hbWVkSWdub3JlQ2FzZSggbmFtZSk7Ci0JfQotCQotCXByaXZhdGUgU2VxdWVuY2Ugc2VxdWVuY2VOYW1lZEludGVybmFsKCBTdHJpbmcgbmFtZSkgewotCQlmb3IoIEl0ZXJhdG9yPFNlcXVlbmNlPiBzdHJlYW0gPSB0aGlzLnNlcXVlbmNlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNlcXVlbmNlIHNlcXVlbmNlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmKCBzZXF1ZW5jZS5nZXROYW1lKCkuZXF1YWxzKCBuYW1lKSkgewotCQkJCXJldHVybiBzZXF1ZW5jZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFNlcXVlbmNlIHNlcXVlbmNlTmFtZWRJZ25vcmVDYXNlKCBTdHJpbmcgbmFtZSkgewotCQlmb3IoIEl0ZXJhdG9yPFNlcXVlbmNlPiBzdHJlYW0gPSB0aGlzLnNlcXVlbmNlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNlcXVlbmNlIHNlcXVlbmNlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmKCBzZXF1ZW5jZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSggbmFtZSkpIHsKLQkJCQlyZXR1cm4gc2VxdWVuY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCWJvb2xlYW4gd3JhcHMoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgc2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNjaGVtYSA9PSBzY2hlbWE7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBTY2hlbWEgc2NoZW1hKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoIHRoaXMuZ2V0TmFtZSgpLCBzY2hlbWEuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1NlcXVlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9TZXF1ZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I2OGE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1NlcXVlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgU2VxdWVuY2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlcXVlbmNlIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8U2VxdWVuY2U+IHsKLQlwcml2YXRlIGZpbmFsIFNjaGVtYSBzY2hlbWE7Ci0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2U7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIHNlcXVlbmNlTGlzdGVuZXI7Ci0KLQlTZXF1ZW5jZSggU2NoZW1hIHNjaGVtYSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIGR0cFNlcXVlbmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmR0cFNlcXVlbmNlID0gZHRwU2VxdWVuY2U7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JCQl0aGlzLnNlcXVlbmNlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VxdWVuY2VMaXN0ZW5lcigpOwotCQkJdGhpcy5hZGRDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTZXF1ZW5jZSwgdGhpcy5zZXF1ZW5jZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uSXNPbmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYS5jb25uZWN0aW9uSXNPbmxpbmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGJ1aWxkU2VxdWVuY2VMaXN0ZW5lcigpIHsKLSAgICAgICByZXR1cm4gbmV3IElDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7Ci0gICAgCSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCBmaW5hbCBJQ2F0YWxvZ09iamVjdCBzZXF1ZW5jZSwgZmluYWwgaW50IGV2ZW50VHlwZSkgewotLy8JCQkJVE9ETwotLy8gICAgCQkJaWYoIHNlcXVlbmNlID09IFNlcXVlbmNlLnRoaXMuZHRwU2VxdWVuY2UpIHsJICAgIAkgICAgCQotLy8gICAgCQkJCVNlcXVlbmNlLnRoaXMuc2NoZW1hLnNlcXVlbmNlQ2hhbmdlZCggU2VxdWVuY2UudGhpcywgZXZlbnRUeXBlKTsKLS8vICAgIAkJCX0KLSAgICAJICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkKLQkJdGhpcy5yZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTZXF1ZW5jZSwgdGhpcy5zZXF1ZW5jZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNlcXVlbmNlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyggU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSggdGhpcy5nZXROYW1lKCksIHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDliNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLlByaW1hcnlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkJhc2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIFRhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZSBleHRlbmRzIERUUFdyYXBwZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPFRhYmxlPiB7Ci0JZmluYWwgU2NoZW1hIHNjaGVtYTsKLQlmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGU7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIHRhYmxlTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBTZXQ8Q29sdW1uPiBjb2x1bW5zOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgU2V0PENvbHVtbj4gcHJpbWFyeUtleUNvbHVtbnM7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBTZXQ8Rm9yZWlnbktleT4gZm9yZWlnbktleXM7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBTZXQ8Q29sdW1uPiBmb3JlaWduS2V5Q29sdW1uczsgIC8vIGxhenktaW5pdGlhbGl6ZWQKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlUYWJsZShTY2hlbWEgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZHRwVGFibGUgPSBkdHBUYWJsZTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiggdGhpcy5jb25uZWN0aW9uSXNPbmxpbmUoKSkgewotCQkJdGhpcy50YWJsZUxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTGlzdGVuZXIoKTsKLQkJCXRoaXMuYWRkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwVGFibGUsIHRoaXMudGFibGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWEuY29ubmVjdGlvbklzT25saW5lKCk7Ci0JfQotCQotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBidWlsZFRhYmxlTGlzdGVuZXIoKSB7Ci0gICAgICAgcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotICAgIAkgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCggZmluYWwgSUNhdGFsb2dPYmplY3QgdGFibGUsIGZpbmFsIGludCBldmVudFR5cGUpIHsgICAgIAotICAgIAkJCWlmKCB0YWJsZSA9PSBUYWJsZS50aGlzLmR0cFRhYmxlKSB7CSAgICAJICAgIAkKLSAgICAJCQkJVGFibGUudGhpcy5yZWZyZXNoKCk7Ci0JICAgIAkJCVRhYmxlLnRoaXMuc2NoZW1hLnRhYmxlQ2hhbmdlZCggVGFibGUudGhpcywgZXZlbnRUeXBlKTsKLSAgICAJCQl9Ci0gICAgCSAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgdm9pZCByZWZyZXNoKCkgewotCQl0aGlzLmRpc3Bvc2VDb2x1bW5zKCk7Ci0JCQotICAgIAl0aGlzLmNvbHVtbnMgPSBudWxsOwotICAgIAl0aGlzLnByaW1hcnlLZXlDb2x1bW5zID0gbnVsbDsKLSAgICAJdGhpcy5mb3JlaWduS2V5cyA9IG51bGw7Ci0gICAgCXRoaXMuZm9yZWlnbktleUNvbHVtbnMgPSBudWxsOwotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMucmVtb3ZlQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwVGFibGUsIHRoaXMudGFibGVMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmRpc3Bvc2VDb2x1bW5zKCk7Ci0JCXRoaXMuZGlzcG9zZUZvcmVpZ25LZXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUNvbHVtbnMoKSB7Ci0JCWlmKCB0aGlzLmNvbHVtbnMgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuY29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwb3NlRm9yZWlnbktleSgpIHsKLQkJaWYoIHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxGb3JlaWduS2V5PiBzdHJlYW0gPSB0aGlzLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUuZ2V0TmFtZSgpOwotCX0KLQkKLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2hvcnRKYXZhQ2xhc3NOYW1lKCkgewotCQlTdHJpbmcgak5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJaWYgKCAhIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWpOYW1lID0gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShqTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGpOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzU2hvcnRKYXZhQ2xhc3NOYW1lKFN0cmluZyBzaG9ydEphdmFDbGFzc05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPwotCQkJdGhpcy5nZXROYW1lKCkuZXF1YWxzKHNob3J0SmF2YUNsYXNzTmFtZSkKLQkJOgotCQkJdGhpcy5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShzaG9ydEphdmFDbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJU3RyaW5nIGpOYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWlmICggISB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlqTmFtZSA9IGpOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcihqTmFtZSk7Ci0JfQotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUgPT0gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgdGFibGUKLQkgKi8KLQlUYWJsZSB0YWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hLnRhYmxlKHRhYmxlKTsKLQl9Ci0KLQkvLyAqKioqKiBjb2x1bW5zCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uPiBnZXRDb2x1bW5zKCkgewotCQlpZiAodGhpcy5jb2x1bW5zID09IG51bGwpIHsKLQkJCXRoaXMuY29sdW1ucyA9IHRoaXMuYnVpbGRDb2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIENvbGxlY3Rpb248b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZHRwQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUuZ2V0Q29sdW1ucygpOwotCX0KLQotCXByaXZhdGUgU2V0PENvbHVtbj4gYnVpbGRDb2x1bW5zKCkgewotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGR0cENvbHVtbnMgPSB0aGlzLmR0cENvbHVtbnMoKTsKLQkJU2V0PENvbHVtbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8Q29sdW1uPihkdHBDb2x1bW5zLnNpemUoKSk7Ci0JCWZvciAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBjIDogZHRwQ29sdW1ucykgewotCQkJcmVzdWx0LmFkZChuZXcgQ29sdW1uKHRoaXMsIGMpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IGNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbnMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgY29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1ucygpLmNvbnRhaW5zKGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxDb2x1bW4sIFN0cmluZz4odGhpcy5jb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQ29sdW1uIG5leHQpIHsKLQkJCQkgcmV0dXJuIG5leHQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZWQobmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uIGNvbHVtbk5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSgpID8gdGhpcy5jb2x1bW5OYW1lZEludGVybmFsKG5hbWUpIDogdGhpcy5jb2x1bW5OYW1lZElnbm9yZUNhc2UobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgQ29sdW1uIGNvbHVtbk5hbWVkSW50ZXJuYWwoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuY29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbiBjb2x1bW5OYW1lZElnbm9yZUNhc2UoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuY29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoY29sdW1uLmdldE5hbWUoKSwgbmFtZSkpIHsKLQkJCQlyZXR1cm4gY29sdW1uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBkdHAgY29sdW1uCi0JICovCi0JQ29sdW1uIGNvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlpZiAoZHRwQ29sdW1uLmdldFRhYmxlKCkgIT0gdGhpcy5kdHBUYWJsZSkgewotCQkJcmV0dXJuIHRoaXMuc2NoZW1hLmNvbHVtbihkdHBDb2x1bW4pOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb2x1bW4gY29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChjb2x1bW4ud3JhcHMoZHRwQ29sdW1uKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBkdHAgY29sdW1uOiAiICsgZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqIHByaW1hcnlLZXlDb2x1bW5zCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uPiBnZXRQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJaWYgKHRoaXMucHJpbWFyeUtleUNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5Q29sdW1ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlDb2x1bW5zOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQ29sbGVjdGlvbjxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBjb2x1bW5zKFByaW1hcnlLZXkgcGspIHsKLQkJcmV0dXJuIHBrLmdldE1lbWJlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxDb2x1bW4+IGJ1aWxkUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCWlmICggISAodGhpcy5kdHBUYWJsZSBpbnN0YW5jZW9mIEJhc2VUYWJsZSkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCVByaW1hcnlLZXkgcGsgPSAoKEJhc2VUYWJsZSkgdGhpcy5kdHBUYWJsZSkuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAocGsgPT0gbnVsbCkgewotCQkJLy8gbm8gUEsgd2FzIGRlZmluZWQKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUNvbGxlY3Rpb248b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gcGtDb2x1bW5zID0gdGhpcy5jb2x1bW5zKHBrKTsKLQkJU2V0PENvbHVtbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8Q29sdW1uPihwa0NvbHVtbnMuc2l6ZSgpKTsKLQkJZm9yIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIHBrQ29sdW1uIDogcGtDb2x1bW5zKSB7Ci0JCQlyZXN1bHQuYWRkKHRoaXMuY29sdW1uKHBrQ29sdW1uKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uPiBwcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmltYXJ5S2V5Q29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5jb250YWlucyhjb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKiogZm9yZWlnbktleXMKLQotCXByaXZhdGUgc3luY2hyb25pemVkIFNldDxGb3JlaWduS2V5PiBnZXRGb3JlaWduS2V5cygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgPT0gbnVsbCkgewotCQkJdGhpcy5mb3JlaWduS2V5cyA9IHRoaXMuYnVpbGRGb3JlaWduS2V5cygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZvcmVpZ25LZXlzOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQ29sbGVjdGlvbjxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBkdHBGb3JlaWduS2V5cygpIHsKLQkJcmV0dXJuICgoQmFzZVRhYmxlKSB0aGlzLmR0cFRhYmxlKS5nZXRGb3JlaWduS2V5cygpOwotCX0KLQotCXByaXZhdGUgU2V0PEZvcmVpZ25LZXk+IGJ1aWxkRm9yZWlnbktleXMoKSB7Ci0JCWlmICggISAodGhpcy5kdHBUYWJsZSBpbnN0YW5jZW9mIEJhc2VUYWJsZSkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUNvbGxlY3Rpb248b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZHRwRm9yZWlnbktleXMgPSB0aGlzLmR0cEZvcmVpZ25LZXlzKCk7Ci0JCVNldDxGb3JlaWduS2V5PiByZXN1bHQgPSBuZXcgSGFzaFNldDxGb3JlaWduS2V5PihkdHBGb3JlaWduS2V5cy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZHRwRm9yZWlnbktleSA6IGR0cEZvcmVpZ25LZXlzKSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBGb3JlaWduS2V5KHRoaXMsIGR0cEZvcmVpZ25LZXkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxGb3JlaWduS2V5PiBmb3JlaWduS2V5cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgZm9yZWlnbktleXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5cygpLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqIGZvcmVpZ25LZXlDb2x1bW5zCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uPiBnZXRGb3JlaWduS2V5Q29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleUNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5mb3JlaWduS2V5Q29sdW1ucyA9IHRoaXMuYnVpbGRGb3JlaWduS2V5Q29sdW1ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZvcmVpZ25LZXlDb2x1bW5zOwotCX0KLQotCXByaXZhdGUgU2V0PENvbHVtbj4gYnVpbGRGb3JlaWduS2V5Q29sdW1ucygpIHsKLQkJaWYgKCAhICh0aGlzLmR0cFRhYmxlIGluc3RhbmNlb2YgQmFzZVRhYmxlKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJU2V0PENvbHVtbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8Q29sdW1uPih0aGlzLmNvbHVtbnNTaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXk+IHN0cmVhbSA9IHRoaXMuZm9yZWlnbktleXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHJlc3VsdCwgc3RyZWFtLm5leHQoKS5iYXNlQ29sdW1ucygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IGZvcmVpZ25LZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBmb3JlaWduS2V5Q29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEZvcmVpZ25LZXlDb2x1bW5zKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZvcmVpZ25LZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucygpLmNvbnRhaW5zKGNvbHVtbik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBUYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKCB0aGlzLmdldE5hbWUoKSwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxNDk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotQGRvdAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZDUwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTY5MGI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDo1NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFkNTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDoyODo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5NDM4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5nZW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7IHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmRiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3M2JkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4MzdlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNGUwNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3NWE4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRW50aXR5IEdlbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRW50aXR5R2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0VudGl0eUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWU2YjkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRW50aXR5R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0vLyBUT0RPIGhhbmRsZSB0YWJsZSBuYW1lcyB0aGF0IGFyZSBpbGxlZ2FsIGNsYXNzIG5hbWVzCi0vLyBUT0RPIGhhbmRsZSB0YWJsZSBuYW1lcyB0aGF0IGFyZSBpbGxlZ2FsIGZpbGUgbmFtZXMKLS8vIFRPRE8gaGFuZGxlIGNvbHVtbiBuYW1lcyB0aGF0IGFyZSBpbGxlZ2FsIGZpZWxkL21ldGhvZCBuYW1lcwotLy8gVE9ETyBmb3JtYXQgY29kZSBwZXIgcHJlZmVyZW5jZXMKLS8vIFRPRE8gb3JnYW5pemUgaW1wb3J0cyBwZXIgcHJlZmVyZW5jZXMKLS8vIFRPRE8gcHJvbXB0IHVzZXIgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGNsYXNzZXMKLS8qKgotICogVGhpcyBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBhbiBlbnRpdHkgZm9yIGEgdGFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlHZW5lcmF0b3IgewotCWZpbmFsIENvbmZpZyBjb25maWc7Ci0JcHJpdmF0ZSBmaW5hbCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudDsKLQlwcml2YXRlIGZpbmFsIEdlblRhYmxlIGdlblRhYmxlOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVudGl0eUNsYXNzTmFtZTsKLQlwcml2YXRlIGZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXI7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGtDbGFzc05hbWU7Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGVFbnRpdHkoQ29uZmlnIGNvbmZpZywgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQsIEdlblRhYmxlIGdlblRhYmxlLCBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKChjb25maWcgPT0gbnVsbCkgfHwgKHBhY2thZ2VGcmFnbWVudCA9PSBudWxsKSB8fCAoZ2VuVGFibGUgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFbnRpdHlHZW5lcmF0b3IoY29uZmlnLCBwYWNrYWdlRnJhZ21lbnQsIGdlblRhYmxlLCBvdmVyd3JpdGVDb25maXJtZXIsIG1vbml0b3IpLmdlbmVyYXRlRW50aXR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yKENvbmZpZyBjb25maWcsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBHZW5UYWJsZSBnZW5UYWJsZSwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudDsKLQkJdGhpcy5nZW5UYWJsZSA9IGdlblRhYmxlOwotCQl0aGlzLmVudGl0eUNsYXNzTmFtZSA9IHRoaXMuZnVsbHlRdWFsaWZ5KHRoaXMuZW50aXR5TmFtZSgpKTsKLQkJdGhpcy5vdmVyd3JpdGVDb25maXJtZXIgPSBvdmVyd3JpdGVDb25maXJtZXI7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCXRoaXMucGtDbGFzc05hbWUgPSB0aGlzLmVudGl0eUNsYXNzTmFtZSArICJQSyI7ICAvLyBoYWNrCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvZGUgZ2VuICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVudGl0eSgpIHsKLQkJaW50IHRvdGFsV29yayA9IHBrQ2xhc3NJc0dlbmVyYXRlZCgpID8gNDAgOiAyMDsKLQkJdHJ5IHsKLQkJCXRoaXMubW9uaXRvci5iZWdpblRhc2soIiIsIHRvdGFsV29yayk7Ci0JCQl0aGlzLmdlbmVyYXRlRW50aXR5XygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMubW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdHlfKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIHRoZSBib2R5IHNvdXJjZSBmaXJzdCBzbyB3ZSBjYW4gZ2F0aGVyIHVwIHRoZSBpbXBvcnQgc3RhdGVtZW50cwotCQl0aGlzLmdlbmVyYXRlU291cmNlRmlsZSh0aGlzLmVudGl0eUNsYXNzTmFtZSwgdGhpcy5lbnRpdHlOYW1lKCkgKyAiLmphdmEiLCB0aGlzLmJ1aWxkU291cmNlKHRoaXMuYnVpbGRCb2R5U291cmNlKCkpKTsKLQkJaWYgKHRoaXMucGtDbGFzc0lzR2VuZXJhdGVkKCkpIHsKLQkJCXRoaXMuZ2VuZXJhdGVTb3VyY2VGaWxlKHRoaXMucGtDbGFzc05hbWUsIHRoaXMucGtOYW1lKCkgKyAiLmphdmEiLCB0aGlzLmJ1aWxkU291cmNlKHRoaXMuYnVpbGRQS0JvZHlTb3VyY2UoKSkpOwotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvdXJjZUZpbGUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXRoaXMucGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSwgc291cmNlLCBmYWxzZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcih0aGlzLm1vbml0b3IsIDEwKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldEphdmFNb2RlbFN0YXR1cygpLmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKSB7Ci0JCQkJaWYgKHRoaXMub3ZlcndyaXRlQ29uZmlybWVyLm92ZXJ3cml0ZShjbGFzc05hbWUpKSB7Ci0JCQkJCXRoaXMucGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSwgc291cmNlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHRoaXMubW9uaXRvciwgMCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBidWlsZCB0aGUgImJvZHkiIHNvdXJjZSBmaXJzdDsgdGhlbiBidWlsZCB0aGUgInBhY2thZ2UiIGFuZCAiaW1wb3J0cyIgc291cmNlCi0JICogYW5kIGNvbmNhdGVuYXRlIHRoZSAiYm9keSIgc291cmNlIHRvIGl0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTb3VyY2UoQm9keVNvdXJjZSBib2R5U291cmNlKSB7Ci0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoYm9keVNvdXJjZS5sZW5ndGgoKSArIDEwMDApOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRoaXMucHJpbnRQYWNrYWdlQW5kSW1wb3J0c09uKHB3LCBib2R5U291cmNlKTsKLQkJcHcucHJpbnQoYm9keVNvdXJjZS5zb3VyY2UoKSk7Ci0JCXRoaXMubW9uaXRvci53b3JrZWQoMTApOwotCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIEJvZHlTb3VyY2UgYnVpbGRCb2R5U291cmNlKCkgewotCQlFbnRpdHlTb3VyY2VXcml0ZXIgcHcgPSBuZXcgRW50aXR5U291cmNlV3JpdGVyKHRoaXMucGFja2FnZU5hbWUoKSwgdGhpcy5lbnRpdHlDbGFzc05hbWUpOwotCQl0aGlzLnByaW50Qm9keVNvdXJjZU9uKHB3KTsKLQkJcmV0dXJuIHB3OwotCX0KLQotCXByaXZhdGUgQm9keVNvdXJjZSBidWlsZFBLQm9keVNvdXJjZSgpIHsKLQkJRW50aXR5U291cmNlV3JpdGVyIHB3ID0gbmV3IEVudGl0eVNvdXJjZVdyaXRlcih0aGlzLnBhY2thZ2VOYW1lKCksIHRoaXMucGtDbGFzc05hbWUpOwotCQl0aGlzLnByaW50UHJpbWFyeUtleUNsYXNzT24ocHcpOwotCQlyZXR1cm4gcHc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Qm9keVNvdXJjZU9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50Q2xhc3NEZWNsYXJhdGlvbk9uKHB3KTsKLQotCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRFbnRpdHlQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50U2VyaWFsVmVyc2lvblVJRChwdyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXRoaXMucHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKHRoaXMuZW50aXR5TmFtZSgpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCksIHB3KTsKLQkJCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSB8fCB0aGlzLmNvbmZpZy5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpIHsKLQkJCQl0aGlzLnByaW50RW50aXR5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lR2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQkJdGhpcy5wcmludEVudGl0eU9uZVRvTWFueUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQl9Ci0JCXB3LnVuZGVudCgpOwotCi0JCXB3LnByaW50KCd9Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRDbGFzc0RlY2xhcmF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRFbnRpdHlBbm5vdGF0aW9uT24ocHcpOwotCQl0aGlzLnByaW50VGFibGVBbm5vdGF0aW9uT24ocHcpOwotCQl0aGlzLnByaW50SWRDbGFzc0Fubm90YXRpb25Pbihwdyk7Ci0KLQkJcHcucHJpbnQoInB1YmxpYyBjbGFzcyAiKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5lbnRpdHlDbGFzc05hbWUpOwotCQlpZiAoY29uZmlnLnNlcmlhbGl6YWJsZSgpKSB7Ci0JCQlwdy5wcmludCgiIGltcGxlbWVudHMgIik7Ci0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbihTZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCQlwdy5wcmludCgiIHsiKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eUFubm90YXRpb25PbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50VGFibGVBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICggISB0aGlzLnRhYmxlKCkubWF0Y2hlc1Nob3J0SmF2YUNsYXNzTmFtZSh0aGlzLmVudGl0eU5hbWUoKSkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCQlwdy5wcmludCh0aGlzLnRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCJcIikiKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkQ2xhc3NBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLnBrQ2xhc3NJc0dlbmVyYXRlZCgpICYmIHRoaXMuY29uZmlnLmdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEsoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5JRF9DTEFTUyk7Ci0JCQlwdy5wcmludCgnKCcpOwotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24ocGtDbGFzc05hbWUpOwotCQkJcHcucHJpbnQoIi5jbGFzcykiKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVByaW1hcnlLZXlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMucGtDbGFzc0lzR2VuZXJhdGVkKCkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlSZWFkT25seVByaW1hcnlLZXlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU1CRURERURfSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50VmlzaWJpbGl0eSh0aGlzLmNvbmZpZy5maWVsZFZpc2liaWxpdHkoKSk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMucGtDbGFzc05hbWUpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludCh0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvckVtYmVkZGVkSWQoKSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5yZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5RmllbGRPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlpZiAoY29sdW1uLm1hdGNoZXNKYXZhRmllbGROYW1lKGZpZWxkTmFtZSkpIHsKLQkJCQl0aGlzLnByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24ocHcpOyAgLy8gbm8gQ29sdW1uIG5hbWUgbmVlZGVkCi0JCQl9IGVsc2UgewotCQkJCXRoaXMucHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBjb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlwdy5wcmludCgiKG5hbWU9XCIiKTsKLQkJcHcucHJpbnQoY29sdW1uTmFtZSk7Ci0JCXB3LnByaW50KCJcIiwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlKSIpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJcHcucHJpbnQoIihpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UpIik7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUud3JpdGFibGVQcmltYXJ5S2V5Q29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleUZpZWxkT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQkJaWYgKCAhIGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShmaWVsZE5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5ub25QcmltYXJ5S2V5QmFzaWNDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljRmllbGRPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJaWYgKCAhIGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShmaWVsZE5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbHVtbi5pc0xvYigpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLkxPQik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludENvbHVtbkFubm90YXRpb25PbihTdHJpbmcgY29sdW1uTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCXB3LnByaW50KGNvbHVtbk5hbWUpOwotCQlwdy5wcmludCgiXCIpIik7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9PbmVSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5tYW55VG9PbmVSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lRmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZE9uKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlwdy5wcmludFZpc2liaWxpdHkodGhpcy5jb25maWcuZmllbGRWaXNpYmlsaXR5KCkpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE1hbnlUb09uZUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBNYW55VG9PbmVSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlwdy5wcmludGxuKCk7Ci0JCUZvcmVpZ25LZXkgZmsgPSByZWxhdGlvbi5nZXRGb3JlaWduS2V5KCk7Ci0JCWlmIChmay5tYXRjaGVzSmF2YUZpZWxkTmFtZShmaWVsZE5hbWUpKSB7Ci0JCQlyZXR1cm47ICAvLyBubyBKb2luQ29sdW1uIGFubm90YXRpb24gbmVlZGVkCi0JCX0KLQkJaWYgKGZrLnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCQlwdy5wcmludChmay5jb2x1bW5QYWlycygpLm5leHQoKS5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCJcIikiKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmay5jb2x1bW5QYWlyc1NpemUoKSA+IDEpIHsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQkJcHcucHJpbnQoIih7Iik7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCXB3LmluZGVudCgpOwotCQkJfQotCQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKGZrLCBwdyk7Ci0JCQlpZiAoZmsuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQkJcHcudW5kZW50KCk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCXB3LnByaW50KCJ9KSIpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbnNPbihGb3JlaWduS2V5IGZvcmVpZ25LZXksIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXkuQ29sdW1uUGFpcj4gc3RyZWFtID0gZm9yZWlnbktleS5jb2x1bW5QYWlycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnRsbignLCcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pbkNvbHVtbkFubm90YXRpb25PbihGb3JlaWduS2V5LkNvbHVtblBhaXIgY29sdW1uUGFpciwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSwgY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpLCBwdyk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0d28gbmFtZXMgaXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBiYXNlQ29sdW1uTmFtZSwgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCXB3LnByaW50KCcoJyk7Ci0JCWlmIChiYXNlQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlwdy5wcmludCgibmFtZT1cIiIpOwotCQkJcHcucHJpbnQoYmFzZUNvbHVtbk5hbWUpOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUNvbHVtbk5hbWUgIT0gbnVsbCkgewotCQkJCXB3LnByaW50KCJcIiwgIik7Ci0JCQl9Ci0JCQlwdy5wcmludCgicmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiKTsKLQkJCXB3LnByaW50KHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCQlwdy5wcmludCgiXCIpIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8T25lVG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUub25lVG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU9uZVRvTWFueUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55RmllbGRPbihPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE9uZVRvTWFueUFubm90YXRpb25PbihmaWVsZE5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOwotCQlwdy5wcmludCgnPCcpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKSk7Ci0JCXB3LnByaW50KCc+Jyk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE9uZVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlwdy5wcmludCgiKG1hcHBlZEJ5PVwiIik7Ci0JCXB3LnByaW50KHJlbGF0aW9uLm1hcHBlZEJ5KCkpOwotCQlwdy5wcmludCgiXCIpIik7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+ICBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkT24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlwdy5wcmludFZpc2liaWxpdHkodGhpcy5jb25maWcuZmllbGRWaXNpYmlsaXR5KCkpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSk7Ci0JCXB3LnByaW50KCc8Jyk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLm5vbk93bmluZ0VudGl0eU5hbWUoKSkpOwotCQlwdy5wcmludCgnPicpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnOycpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJIGd1ZXNzIHlvdSBjb3VsZCBidWlsZCBhIHN0YXRlIG1hY2hpbmUgZm9yIGFsbCB0aGlzIGNyYXAsCi0JICogYnV0IHRoYXQgc2VlbXMgbGlrZSBvdmVya2lsbC4uLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludE93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCXB3LnByaW50bG4oKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKLQkJaWYgKCAhIHJlbGF0aW9uLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSkgewotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCXB3LnByaW50KCcoJyk7Ci0JCQl9Ci0JCQlwdy5wcmludCgibmFtZT1cIiIpOwotCQkJcHcucHJpbnQocmVsYXRpb24uZ2V0Sm9pblRhYmxlKCkubmFtZSgpKTsKLQkJCXB3LnByaW50KCdcIicpOwotCQkJY29tbWEgPSB0cnVlOwotCQl9Ci0JCWlmICggISByZWxhdGlvbi5qb2luQ29sdW1uc0lzRGVmYXVsdEZvcihmaWVsZE5hbWUpKSB7Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJcHcucHJpbnQoJygnKTsKLQkJCX0gZWxzZSBpZiAoY29tbWEpIHsKLQkJCQlwdy5wcmludCgnLCcpOwotCQkJfQotCQkJcHcucHJpbnRsbigpOwotCQkJcHcuaW5kZW50KCk7Ci0JCQl0aGlzLnByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbigiam9pbkNvbHVtbnMiLCBmaWVsZE5hbWUsIHJlbGF0aW9uLmdldE93bmluZ0ZvcmVpZ25LZXkoKSwgcHcpOwotCQkJcHcudW5kZW50KCk7Ci0JCQljb21tYSA9IHRydWU7Ci0JCX0KLQkJU3RyaW5nIGludmVyc2VGaWVsZE5hbWUgPSByZWxhdGlvbi5nZXROb25Pd25pbmdUYWJsZSgpLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICggISByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnNJc0RlZmF1bHRGb3IoaW52ZXJzZUZpZWxkTmFtZSkpIHsKLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCQlwdy5wcmludCgnKCcpOwotCQkJfSBlbHNlIGlmIChjb21tYSkgewotCQkJCXB3LnByaW50KCcsJyk7Ci0JCQl9Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKCJpbnZlcnNlSm9pbkNvbHVtbnMiLCBpbnZlcnNlRmllbGROYW1lLCByZWxhdGlvbi5nZXROb25Pd25pbmdGb3JlaWduS2V5KCksIHB3KTsKLQkJCXB3LnVuZGVudCgpOwotCQkJY29tbWEgPSB0cnVlOwotCQl9Ci0JCWlmICggISBmaXJzdCkgewotCQkJcHcucHJpbnQoJyknKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbihTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBmaWVsZE5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmIChmb3JlaWduS2V5LmNvbHVtblBhaXJzU2l6ZSgpICE9IDEpIHsKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCX0gZWxzZSBpZiAoZm9yZWlnbktleS5nZXRSZWZlcmVuY2VkVGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkvLyBpZiB0aGUgcmVmZXJlbmNlZCB0YWJsZSBoYXMgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXksIG5laXRoZXIgb2YgdGhlIGNvbHVtbnMgY2FuIGJlIGEgZGVmYXVsdAotCQkJLy8gc2luY2UgYm90aCBvZiB0aGUgZGVmYXVsdHMgcmVxdWlyZSBhIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQlGb3JlaWduS2V5LkNvbHVtblBhaXIgY29sdW1uUGFpciA9IGZvcmVpZ25LZXkuY29sdW1uUGFpcnMoKS5uZXh0KCk7Ci0JCQlDb2x1bW4gcGtDb2x1bW4gPSBmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCkubmV4dCgpOwotCQkJaWYgKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLm1hdGNoZXNKYXZhRmllbGROYW1lKGZpZWxkTmFtZSArICJfIiArIHBrQ29sdW1uLmdldE5hbWUoKSkpIHsKLQkJCQlpZiAoY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkgPT0gcGtDb2x1bW4pIHsKLQkJCQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlLi4uCi0JCQkJfSBlbHNlIHsKLQkJCQkJcHcucHJpbnQoZWxlbWVudE5hbWUpOwotCQkJCQlwdy5wcmludCgnPScpOwotCQkJCQl0aGlzLnByaW50Sm9pbkNvbHVtbkFubm90YXRpb25PbihudWxsLCBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCksIHB3KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKSA9PSBwa0NvbHVtbikgewotCQkJCQlwdy5wcmludChlbGVtZW50TmFtZSk7Ci0JCQkJCXB3LnByaW50KCc9Jyk7Ci0JCQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSwgbnVsbCwgcHcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbihTdHJpbmcgZWxlbWVudE5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KGVsZW1lbnROYW1lKTsKLQkJcHcucHJpbnQoJz0nKTsKLQkJaWYgKGZvcmVpZ25LZXkuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQlwdy5wcmludCgneycpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcuaW5kZW50KCk7Ci0JCX0KLQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKGZvcmVpZ25LZXksIHB3KTsKLQkJaWYgKGZvcmVpZ25LZXkuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55RmllbGRPbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnROb25Pd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24oZmllbGROYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0JCXB3LnByaW50VmlzaWJpbGl0eSh0aGlzLmNvbmZpZy5maWVsZFZpc2liaWxpdHkoKSk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMuY29uZmlnLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpKTsKLQkJcHcucHJpbnQoJzwnKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5mdWxseVF1YWxpZnkocmVsYXRpb24ub3duaW5nRW50aXR5TmFtZSgpKSk7Ci0JCXB3LnByaW50KCc+Jyk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE5vbk93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCXB3LnByaW50KCIobWFwcGVkQnk9XCIiKTsKLQkJcHcucHJpbnQocmVsYXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCXB3LnByaW50KCJcIikiKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmeShTdHJpbmcgc2hvcnRDbGFzc05hbWUpIHsKLQkJU3RyaW5nIHBrZyA9IHRoaXMucGFja2FnZU5hbWUoKTsKLQkJcmV0dXJuIChwa2cubGVuZ3RoKCkgPT0gMCkgPyBzaG9ydENsYXNzTmFtZSA6IHBrZyArICcuJyArIHNob3J0Q2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFNlcmlhbFZlcnNpb25VSUQoRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSkgewotCQkJcHcucHJpbnQoInByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyIpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50WmVyb0FyZ3VtZW50Q29uc3RydWN0b3JPbihTdHJpbmcgY3Rvck5hbWUsIFN0cmluZyB2aXNpYmlsaXR5LCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsKLQkJCXB3LnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXB3LnByaW50KGN0b3JOYW1lKTsKLQkJCXB3LnByaW50KCIoKSB7Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJzdXBlcigpOyIpOwotCQkJcHcudW5kZW50KCk7Ci0JCQlwdy5wcmludCgnfScpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLnBrQ2xhc3NJc0dlbmVyYXRlZCgpICYmIHRoaXMuY29uZmlnLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSkgewotCQkJdGhpcy5wcmludEVudGl0eUVtYmVkZGVkSWRQcmltYXJ5S2V5R2V0dGVyQW5kU2V0dGVyT24ocHcpOwotCQl9IGVsc2UgewotCQkJdGhpcy5wcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlHZXR0ZXJBbmRTZXR0ZXJPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLkVNQkVEREVEX0lEKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCQlwdy5wcmludEdldHRlckFuZFNldHRlcih0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvckVtYmVkZGVkSWQoKSwgdGhpcy5wa0NsYXNzTmFtZSwgdGhpcy5jb25maWcubWV0aG9kVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlSZWFkT25seVByaW1hcnlLZXlHZXR0ZXJzQW5kU2V0dGVyc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5yZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUdldHRlckFuZFNldHRlck9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLklEKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCWlmIChjb2x1bW4ubWF0Y2hlc0phdmFGaWVsZE5hbWUocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMucHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25Pbihwdyk7ICAvLyBubyBDb2x1bW4gbmFtZSBuZWVkZWQKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5wcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtbi5nZXROYW1lKCksIHB3KTsKLQkJCX0KLQkJfQotCi0JCXB3LnByaW50R2V0dGVyQW5kU2V0dGVyKHByb3BlcnR5TmFtZSwgY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSwgdGhpcy5jb25maWcubWV0aG9kVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlHZXR0ZXJzQW5kU2V0dGVyc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS53cml0YWJsZVByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleUdldHRlckFuZFNldHRlck9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLklEKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCWlmICggISBjb2x1bW4ubWF0Y2hlc0phdmFGaWVsZE5hbWUocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMucHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uLmdldE5hbWUoKSwgcHcpOwotCQkJfQotCQl9Ci0KLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCBjb2x1bW4uamF2YVR5cGVEZWNsYXJhdGlvbigpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0dldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljR2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljR2V0dGVyQW5kU2V0dGVyT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCWlmICggISBjb2x1bW4ubWF0Y2hlc0phdmFGaWVsZE5hbWUocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMucHJpbnRDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uLmdldE5hbWUoKSwgcHcpOwotCQkJfQotCQl9Ci0KLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCBjb2x1bW4uamF2YVR5cGVEZWNsYXJhdGlvbigpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvT25lUmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubWFueVRvT25lUmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU1hbnlUb09uZUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU1hbnlUb09uZUdldHRlckFuZFNldHRlck9uKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKHByb3BlcnR5TmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCi0JCVN0cmluZyB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKTsKLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCB0eXBlRGVjbGFyYXRpb24sIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxPbmVUb01hbnlSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5vbmVUb01hbnlSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55R2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55R2V0dGVyQW5kU2V0dGVyT24oT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnRPbmVUb01hbnlBbm5vdGF0aW9uT24ocHJvcGVydHlOYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKTsKLQkJcHcucHJpbnRDb2xsZWN0aW9uR2V0dGVyQW5kU2V0dGVyKHByb3BlcnR5TmFtZSwgdGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCksIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T3duZWRNYW55VG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUub3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueUdldHRlckFuZFNldHRlck9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE93bmVkTWFueVRvTWFueUFubm90YXRpb25Pbihwcm9wZXJ0eU5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLm5vbk93bmluZ0VudGl0eU5hbWUoKSk7Ci0JCXB3LnByaW50Q29sbGVjdGlvbkdldHRlckFuZFNldHRlcihwcm9wZXJ0eU5hbWUsIHRoaXMuY29uZmlnLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlHZXR0ZXJBbmRTZXR0ZXJPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlHZXR0ZXJBbmRTZXR0ZXJPbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnROb25Pd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24ocHJvcGVydHlOYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24gPSB0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5vd25pbmdFbnRpdHlOYW1lKCkpOwotCQlwdy5wcmludENvbGxlY3Rpb25HZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCB0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgdGhpcy5jb25maWcubWV0aG9kVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5Q2xhc3NPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCQlwdy5wcmludCgicHVibGljIGNsYXNzICIpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLnBrQ2xhc3NOYW1lKTsKLQkJcHcucHJpbnQoIiBpbXBsZW1lbnRzICIpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbihTZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIiB7Iik7Ci0JCXB3LnByaW50bG4oKTsKLQotCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRJZEZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRTZXJpYWxWZXJzaW9uVUlEKHB3KTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKHRoaXMucGtOYW1lKCksICJwdWJsaWMiLCBwdyk7Ci0KLQkJCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSB8fCB0aGlzLmNvbmZpZy5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpIHsKLQkJCQl0aGlzLnByaW50SWRHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCX0KLQotCQkJdGhpcy5wcmludEVxdWFsc01ldGhvZE9uKHRoaXMucGtOYW1lKCksIHRoaXMudGFibGUoKS5wcmltYXJ5S2V5Q29sdW1ucygpLCBwdyk7Ci0JCQl0aGlzLnByaW50SGFzaENvZGVNZXRob2RPbih0aGlzLnRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKSwgcHcpOwotCQlwdy51bmRlbnQoKTsKLQotCQlwdy5wcmludCgnfScpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMudGFibGUoKS5wcmltYXJ5S2V5Q29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRJZEZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRGaWVsZE9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRJZEdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLnRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50SWRHZXR0ZXJBbmRTZXR0ZXJPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRJZEdldHRlckFuZFNldHRlck9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCBjb2x1bW4uamF2YVR5cGVEZWNsYXJhdGlvbigpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVxdWFsc01ldGhvZE9uKFN0cmluZyBjbGFzc05hbWUsIEl0ZXJhdG9yPENvbHVtbj4gY29sdW1ucywgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbigiamF2YS5sYW5nLk92ZXJyaWRlIik7Ci0JCXB3LnByaW50bG4oKTsKLQotCQlwdy5wcmludGxuKCJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlwdy5wcmludGxuKCJpZiAobyA9PSB0aGlzKSB7Iik7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gdHJ1ZTsiKTsKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnQoJ30nKTsKLQkJCXB3LnByaW50bG4oKTsKLQotCQkJcHcucHJpbnQoImlmICggISAobyBpbnN0YW5jZW9mICIpOwotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpKSB7Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gZmFsc2U7Iik7Ci0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KGNsYXNzTmFtZSk7Ci0JCQlwdy5wcmludCgiIG90aGVyID0gKCIpOwotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpIG87Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KCJyZXR1cm4gIik7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQl3aGlsZSAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQkJdGhpcy5wcmludEVxdWFsc0NsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBwdyk7Ci0JCQkJCWlmIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCQkJcHcucHJpbnRsbigpOwotCQkJCQkJcHcucHJpbnQoIiYmICIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXB3LnByaW50KCc7Jyk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJcHcudW5kZW50KCk7Ci0JCXB3LnVuZGVudCgpOwotCQlwdy5wcmludCgnfScpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFcXVhbHNDbGF1c2VPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gY29sdW1uLmphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVFcXVhbHNDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoIih0aGlzLiIpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgiID09IG90aGVyLiIpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnKScpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludCgidGhpcy4iKTsKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoIi5lcXVhbHMob3RoZXIuIik7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SGFzaENvZGVNZXRob2RPbihJdGVyYXRvcjxDb2x1bW4+IGNvbHVtbnMsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oImphdmEubGFuZy5PdmVycmlkZSIpOwotCQlwdy5wcmludGxuKCk7Ci0KLQkJcHcucHJpbnRsbigicHVibGljIGludCBoYXNoQ29kZSgpIHsiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlwdy5wcmludCgicmV0dXJuICIpOwotCQkJcHcuaW5kZW50KCk7Ci0JCQkJd2hpbGUgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCXRoaXMucHJpbnRIYXNoQ29kZUNsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBwdyk7Ci0JCQkJCWlmIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCQkJcHcucHJpbnRsbigpOwotCQkJCQkJcHcucHJpbnQoIl4gIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHcucHJpbnQoJzsnKTsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQlwdy51bmRlbnQoKTsKLQkJcHcudW5kZW50KCk7Ci0JCXB3LnByaW50KCd9Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEhhc2hDb2RlQ2xhdXNlT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlKYXZhVHlwZSBqYXZhVHlwZSA9IGNvbHVtbi5qYXZhVHlwZSgpOwotCQlpZiAoamF2YVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJdGhpcy5wcmludFByaW1pdGl2ZUhhc2hDb2RlQ2xhdXNlT24oamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCksIGZpZWxkTmFtZSwgcHcpOwotCQl9IGVsc2UgewotCQkJdGhpcy5wcmludFJlZmVyZW5jZUhhc2hDb2RlQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKFN0cmluZyBwcmltaXRpdmVOYW1lLCBTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJpbnQiKSB8fCBwcmltaXRpdmVOYW1lLmVxdWFscygic2hvcnQiKSB8fCBwcmltaXRpdmVOYW1lLmVxdWFscygiYnl0ZSIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJjaGFyIikpIHsKLQkJCXB3LnByaW50KCJ0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygibG9uZyIpKSB7ICAvLyBjcmliYmVkIGZyb20gTG9uZyNoYXNoQ29kZSgpCi0JCQkvLyAoKGludCkgKHRoaXMudmFsdWUgXiAodGhpcy52YWx1ZSA+Pj4gMzIpKSkKLQkJCXB3LnByaW50KCIoKGludCkgKHRoaXMuIik7Ci0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIiBeICh0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIgPj4+IDMyKSkpIik7Ci0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImRvdWJsZSIpKSB7ICAvLyBjcmliYmVkIGZyb20gRG91YmxlI2hhc2hDb2RlKCkKLQkJCS8vCSgoaW50KSAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpIF4gKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSA+Pj4gMzIpKSkKLQkJCXB3LnByaW50KCIoKGludCkgKCIpOwotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCXB3LnByaW50KCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIpIF4gKCIpOwotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCXB3LnByaW50KCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIpID4+PiAzMikpKSIpOwotCQl9IGVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJmbG9hdCIpKSB7ICAvLyBjcmliYmVkIGZyb20gRmxvYXQjaGFzaENvZGUoKQotCQkJLy8gamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpCi0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkZsb2F0Iik7Ci0JCQlwdy5wcmludCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7Ci0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoJyknKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7ICAvLyBjcmliYmVkIGZyb20gQm9vbGVhbiNoYXNoQ29kZSgpCi0JCQkvLyAodGhpcy52YWx1ZSA/IDEyMzEgOiAxMjM3KQotCQkJcHcucHJpbnQoIih0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIgPyAxMjMxIDogMTIzNykiKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocHJpbWl0aXZlTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRSZWZlcmVuY2VIYXNoQ29kZUNsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludCgidGhpcy4iKTsKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoIi5oYXNoQ29kZSgpIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UGFja2FnZUFuZEltcG9ydHNPbihQcmludFdyaXRlciBwdywgQm9keVNvdXJjZSBib2R5U291cmNlKSB7Ci0JCWlmICh0aGlzLnBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgIT0gMCkgewotCQkJcHcucHJpbnQoInBhY2thZ2UgIik7Ci0JCQlwdy5wcmludCh0aGlzLnBhY2thZ2VOYW1lKCkpOwotCQkJcHcucHJpbnQoJzsnKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gc3RyZWFtID0gYm9keVNvdXJjZS5pbXBvcnRFbnRyaWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlwdy5wcmludCgiaW1wb3J0ICIpOwotCQkJcHcucHJpbnQoZW50cnkuZ2V0VmFsdWUoKSk7ICAvLyBwYWNrYWdlCi0JCQlwdy5wcmludCgnLicpOwotCQkJcHcucHJpbnQoZW50cnkuZ2V0S2V5KCkpOyAgLy8gc2hvcnQgY2xhc3MgbmFtZQotCQkJcHcucHJpbnQoJzsnKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCXByaXZhdGUgVGFibGUgdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlLmdldFRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHBrTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5TmFtZSgpICsgIlBLIjsgIC8vIGhhY2sKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGtDbGFzc0lzR2VuZXJhdGVkKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogd3JpdGVyICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIEJvZHlTb3VyY2UgewotCi0JCS8qKgotCQkgKiByZXR1cm4gYSBzb3J0ZWQgc2V0IG9mIG1hcCBlbnRyaWVzOyB0aGUga2V5IGlzIHRoZSBzaG9ydCBjbGFzcyBuYW1lLAotCQkgKiB0aGUgdmFsdWUgaXMgdGhlIHBhY2thZ2UgbmFtZQotCQkgKi8KLQkJSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gaW1wb3J0RW50cmllcygpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gdGhlIGJvZHkgc291cmNlIGNvZGUKLQkJICovCi0JCVN0cmluZyBzb3VyY2UoKTsKLQotCQkvKioKLQkJICogcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGJvZHkgc291cmNlIGNvZGUKLQkJICovCi0JCWludCBsZW5ndGgoKTsKLQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCBJbmRlbnRpbmdQcmludFdyaXRlciB3aXRoIHNvbWUgbWV0aG9kcyB0aGF0IGZhY2lsaXRhdGUgYnVpbGRpbmcKLQkgKiBjbGFzcyBzb3VyY2UgY29kZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlTb3VyY2VXcml0ZXIgZXh0ZW5kcyBJbmRlbnRpbmdQcmludFdyaXRlciBpbXBsZW1lbnRzIEJvZHlTb3VyY2UgewotCQlmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWU7Ci0JCS8vIGtleSA9IHNob3J0IGNsYXNzIG5hbWU7IHZhbHVlID0gcGFja2FnZSBuYW1lCi0JCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBpbXBvcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkJRW50aXR5U291cmNlV3JpdGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJc3VwZXIobmV3IFN0cmluZ1dyaXRlcigyMDAwMCkpOwotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCX0KLQotCQl2b2lkIHByaW50VmlzaWJpbGl0eShTdHJpbmcgdmlzaWJpbGl0eU1vZGlmaWVyKSB7Ci0JCQlpZiAodmlzaWJpbGl0eU1vZGlmaWVyLmxlbmd0aCgpICE9IDApIHsKLQkJCQl0aGlzLnByaW50KHZpc2liaWxpdHlNb2RpZmllcik7Ci0JCQkJdGhpcy5wcmludCgnICcpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBwcmludEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCQl0aGlzLnByaW50KCdAJyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJfQotCi0JCXZvaWQgcHJpbnRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQkJdGhpcy5wcmludCh0aGlzLmltcG9ydGVkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbikpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzJ3MgImltcG9ydGVkIiBuYW1lLgotCQkgKiBUaGUgY2xhc3MgZGVjbGFyYXRpb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKLQkJICogICAgICJpbnQiCi0JCSAqICAgICAiaW50W10iIChub3QgIltJIikKLQkJICogICAgICJqYXZhLmxhbmcuT2JqZWN0IgotCQkgKiAgICAgImphdmEubGFuZy5PYmplY3RbXSIgKG5vdCAiW0xqYXZhLmxhbmcuT2JqZWN0OyIpCi0JCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeSIgKG5vdCAiamF2YS51dGlsLk1hcCRFbnRyeSIpCi0JCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeVtdW10iIChub3QgIltbTGphdmEudXRpbC5NYXAkRW50cnk7IikKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGltcG9ydGVkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCWlmICh0aGlzLnR5cGVEZWNsYXJhdGlvbklzTWVtYmVyQ2xhc3ModHlwZURlY2xhcmF0aW9uKSkgewotCQkJCS8vIG5vIG5lZWQgZm9yIGFuIGltcG9ydCwganVzdCByZXR1cm4gdGhlIHBhcnRpYWxseS1xdWFsaWZpZWQgbmFtZQotCQkJCXJldHVybiB0aGlzLm1lbWJlckNsYXNzVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sYXN0SW5kZXhPZignLicpOwotCQkJU3RyaW5nIHBrZyA9IChsYXN0ID09IC0xKSA/ICIiIDogdHlwZURlY2xhcmF0aW9uLnN1YnN0cmluZygwLCBsYXN0KTsKLQkJCVN0cmluZyBzaG9ydFR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcobGFzdCArIDEpOwotCQkJU3RyaW5nIHNob3J0RWxlbWVudFR5cGVOYW1lID0gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCQl3aGlsZSAoc2hvcnRFbGVtZW50VHlwZU5hbWUuZW5kc1dpdGgoIltdIikpIHsKLQkJCQlzaG9ydEVsZW1lbnRUeXBlTmFtZSA9IHNob3J0RWxlbWVudFR5cGVOYW1lLnN1YnN0cmluZygwLCBzaG9ydEVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSAtIDIpOwotCQkJfQotCQkJU3RyaW5nIHByZXYgPSB0aGlzLmltcG9ydHMuZ2V0KHNob3J0RWxlbWVudFR5cGVOYW1lKTsKLQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBmaXJzdCBjbGFzcyB3aXRoIHRoaXMgc2hvcnQgZWxlbWVudCB0eXBlIG5hbWUKLQkJCQl0aGlzLmltcG9ydHMucHV0KHNob3J0RWxlbWVudFR5cGVOYW1lLCBwa2cpOwotCQkJCXJldHVybiBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJCX0KLQkJCWlmIChwcmV2LmVxdWFscyhwa2cpKSB7Ci0JCQkJLy8gdGhpcyBlbGVtZW50IHR5cGUgaGFzIGFscmVhZHkgYmVlbiBpbXBvcnRlZAotCQkJCXJldHVybiBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJCX0KLQkJCS8vIGFub3RoZXIgY2xhc3Mgd2l0aCB0aGUgc2FtZSBzaG9ydCBlbGVtZW50IHR5cGUgbmFtZSBoYXMgYmVlbgotCQkJLy8gcHJldmlvdXNseSBpbXBvcnRlZCwgc28gdGhpcyBvbmUgbXVzdCBiZSB1c2VkIGZ1bGx5LXF1YWxpZmllZAotCQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBlLmcuICJmb28uYmFyLkVtcGxveWVlLlBLIiB3aWxsIHJldHVybiB0cnVlCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gdHlwZURlY2xhcmF0aW9uSXNNZW1iZXJDbGFzcyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSA+IHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKQotCQkJCQkmJiB0eXBlRGVjbGFyYXRpb24uc3RhcnRzV2l0aCh0aGlzLmNsYXNzTmFtZSkKLQkJCQkJJiYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQodGhpcy5jbGFzc05hbWUubGVuZ3RoKCkpID09ICcuJyk7Ci0JCX0KLQotCQkvKioKLQkJICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gIkVtcGxveWVlLlBLIgotCQkgKiB0aGlzIHByZXZlbnRzIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBpbXBvcnRlZCBjbGFzc2VzIChlLmcuICJqb28uamFyLlBLIikKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIG1lbWJlckNsYXNzVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCWludCBpbmRleCA9IHRoaXMucGFja2FnZU5hbWUubGVuZ3RoKCk7Ci0JCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCWluZGV4Kys7ICAvLyBidW1wIHBhc3QgdGhlICcuJwotCQkJfQotCQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGltcG9ydEVudHJpZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KHRoaXMuc29ydGVkSW1wb3J0RW50cmllcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBuZXh0KSB7Ci0JCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCQlTdHJpbmcgcGtnID0gKChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+KSBuZXh0KS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAocGtnLmVxdWFscygiIikKLQkJCQkJCQl8fCBwa2cuZXF1YWxzKCJqYXZhLmxhbmciKQotCQkJCQkJCXx8IHBrZy5lcXVhbHMoRW50aXR5U291cmNlV3JpdGVyLnRoaXMucGFja2FnZU5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gc29ydGVkSW1wb3J0RW50cmllcygpIHsKLQkJCVRyZWVTZXQ8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gc29ydGVkSW1wb3J0cyA9IG5ldyBUcmVlU2V0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KHRoaXMuYnVpbGRJbXBvcnRFbnRyaWVzQ29tcGFyYXRvcigpKTsKLQkJCXNvcnRlZEltcG9ydHMuYWRkQWxsKHRoaXMuaW1wb3J0cy5lbnRyeVNldCgpKTsKLQkJCXJldHVybiBzb3J0ZWRJbXBvcnRzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwcml2YXRlIENvbXBhcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gYnVpbGRJbXBvcnRFbnRyaWVzQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlMSwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlMikgewotCQkJCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQkJCWludCBwa2cgPSBjb2xsYXRvci5jb21wYXJlKGUxLmdldFZhbHVlKCksIGUyLmdldFZhbHVlKCkpOwotCQkJCQlyZXR1cm4gKHBrZyA9PSAwKSA/IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0S2V5KCksIGUyLmdldEtleSgpKSA6IHBrZzsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBwcmludEdldHRlckFuZFNldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludEdldHRlcihwcm9wZXJ0eU5hbWUsIHR5cGVEZWNsYXJhdGlvbiwgdmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLnByaW50U2V0dGVyKHByb3BlcnR5TmFtZSwgdHlwZURlY2xhcmF0aW9uLCB2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJpbnRHZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnICcpOwotCQkJdGhpcy5wcmludCh0eXBlRGVjbGFyYXRpb24uZXF1YWxzKCJib29sZWFuIikgPyAiaXMiIDogImdldCIpOwotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgiKCkgeyIpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMuaW5kZW50KCk7Ci0JCQkJdGhpcy5wcmludCgicmV0dXJuIHRoaXMuIik7Ci0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMudW5kZW50KCk7Ci0KLQkJCXRoaXMucHJpbnQoJ30nKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcmludFNldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50KCJ2b2lkIHNldCIpOwotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgnKCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnICcpOwotCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJdGhpcy5wcmludCgiKSB7Iik7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5pbmRlbnQoKTsKLQkJCQl0aGlzLnByaW50KCJ0aGlzLiIpOwotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCIgPSAiKTsKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgnOycpOwotCQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy51bmRlbnQoKTsKLQotCQkJdGhpcy5wcmludCgnfScpOwotCQl9Ci0KLQkJdm9pZCBwcmludENvbGxlY3Rpb25HZXR0ZXJBbmRTZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIFN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludENvbGxlY3Rpb25HZXR0ZXIocHJvcGVydHlOYW1lLCBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCB2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMucHJpbnRDb2xsZWN0aW9uU2V0dGVyKHByb3BlcnR5TmFtZSwgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgdmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByaW50Q29sbGVjdGlvbkdldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCc8Jyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgiPiBnZXQiKTsKLQkJCXRoaXMucHJpbnQoU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShwcm9wZXJ0eU5hbWUpKTsKLQkJCXRoaXMucHJpbnQoIigpIHsiKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLmluZGVudCgpOwotCQkJCXRoaXMucHJpbnQoInJldHVybiB0aGlzLiIpOwotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCc7Jyk7Ci0JCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnVuZGVudCgpOwotCi0JCQl0aGlzLnByaW50KCd9Jyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJpbnRDb2xsZWN0aW9uU2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludCgidm9pZCBzZXQiKTsKLQkJCXRoaXMucHJpbnQoU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShwcm9wZXJ0eU5hbWUpKTsKLQkJCXRoaXMucHJpbnQoJygnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCc8Jyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlRGVjbGFyYXRpb24pOwotCQkJdGhpcy5wcmludCgnPicpOwotCQkJdGhpcy5wcmludCgnICcpOwotCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJdGhpcy5wcmludCgiKSB7Iik7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5pbmRlbnQoKTsKLQkJCQl0aGlzLnByaW50KCJ0aGlzLiIpOwotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCIgPSAiKTsKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgnOycpOwotCQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy51bmRlbnQoKTsKLQotCQkJdGhpcy5wcmludCgnfScpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBzb3VyY2UoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vdXQudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQkJcmV0dXJuICgoU3RyaW5nV3JpdGVyKSB0aGlzLm91dCkuZ2V0QnVmZmVyKCkubGVuZ3RoKCk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWcgewotCQlwcml2YXRlIGJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlID0gdHJ1ZTsKLQkJcHJpdmF0ZSBib29sZWFuIHByb3BlcnR5QWNjZXNzVHlwZSA9IGZhbHNlOyAgLy8gYXMgb3Bwb3NlZCB0byAiZmllbGQiCi0JCXByaXZhdGUgU3RyaW5nIGNvbGxlY3Rpb25UeXBlTmFtZSA9IFNldC5jbGFzcy5nZXROYW1lKCk7Ci0JCXByaXZhdGUgaW50IGZpZWxkVmlzaWJpbGl0eSA9IE1vZGlmaWVyLlBSSVZBVEU7Ci0JCXByaXZhdGUgaW50IG1ldGhvZFZpc2liaWxpdHkgPSBNb2RpZmllci5QVUJMSUM7Ci0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzID0gdHJ1ZTsKLQkJcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJcHJpdmF0ZSBib29sZWFuIHNlcmlhbGl6YWJsZSA9IHRydWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQgPSB0cnVlOwotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyA9IHRydWU7ICAvLyBhcyBvcHBvc2VkIHRvIElkQ2xhc3MKLQkJcHJpdmF0ZSBNYXA8VGFibGUsIFN0cmluZz4gb3ZlcnJpZGVFbnRpdHlOYW1lcyA9IG5ldyBIYXNoTWFwPFRhYmxlLCBTdHJpbmc+KCk7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURSA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0UgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNURUQgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSUMgPSAzOwotCi0KLQkJcHVibGljIGJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlKCkgewotCQkJcmV0dXJuIHRoaXMuY29udmVydFRvQ2FtZWxDYXNlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbnZlcnRUb0NhbWVsQ2FzZShib29sZWFuIGNvbnZlcnRUb0NhbWVsQ2FzZSkgewotCQkJdGhpcy5jb252ZXJ0VG9DYW1lbENhc2UgPSBjb252ZXJ0VG9DYW1lbENhc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eUFjY2Vzc1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eUFjY2Vzc1R5cGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UHJvcGVydHlBY2Nlc3NUeXBlKGJvb2xlYW4gcHJvcGVydHlBY2Nlc3NUeXBlKSB7Ci0JCQl0aGlzLnByb3BlcnR5QWNjZXNzVHlwZSA9IHByb3BlcnR5QWNjZXNzVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGZpZWxkQWNjZXNzVHlwZSgpIHsKLQkJCXJldHVybiAhIHRoaXMucHJvcGVydHlBY2Nlc3NUeXBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZpZWxkQWNjZXNzVHlwZShib29sZWFuIGZpZWxkQWNjZXNzVHlwZSkgewotCQkJdGhpcy5wcm9wZXJ0eUFjY2Vzc1R5cGUgPSAhIGZpZWxkQWNjZXNzVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvblR5cGVOYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbGxlY3Rpb25UeXBlTmFtZShTdHJpbmcgY29sbGVjdGlvblR5cGVOYW1lKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25UeXBlTmFtZSA9IGNvbGxlY3Rpb25UeXBlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RmllbGRWaXNpYmlsaXR5KCkgewotCQkJcmV0dXJuIHRoaXMuZmllbGRWaXNpYmlsaXR5OwotCQl9Ci0JCS8qKiBlbnRpdHkgZmllbGRzIGNhbm5vdCBiZSAncHVibGljJyAqLwotCQlwdWJsaWMgdm9pZCBzZXRGaWVsZFZpc2liaWxpdHkoaW50IGZpZWxkVmlzaWJpbGl0eSkgewotCQkJc3dpdGNoIChmaWVsZFZpc2liaWxpdHkpIHsKLQkJCQljYXNlIFBSSVZBVEU6Ci0JCQkJY2FzZSBQQUNLQUdFOgotCQkJCWNhc2UgUFJPVEVDVEVEOgotCQkJCQl0aGlzLmZpZWxkVmlzaWJpbGl0eSA9IGZpZWxkVmlzaWJpbGl0eTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBmaWVsZCB2aXNpYmlsaXR5OiAiICsgZmllbGRWaXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZmllbGRWaXNpYmlsaXR5KCkgewotCQkJc3dpdGNoICh0aGlzLmZpZWxkVmlzaWJpbGl0eSkgewotCQkJCWNhc2UgUFJJVkFURToKLQkJCQkJcmV0dXJuICJwcml2YXRlIjsKLQkJCQljYXNlIFBBQ0tBR0U6Ci0JCQkJCXJldHVybiAiIjsKLQkJCQljYXNlIFBST1RFQ1RFRDoKLQkJCQkJcmV0dXJuICJwcm90ZWN0ZWQiOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgZmllbGQgdmlzaWJpbGl0eTogIiArIHRoaXMuZmllbGRWaXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TWV0aG9kVmlzaWJpbGl0eSgpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZFZpc2liaWxpdHk7Ci0JCX0KLQkJLyoqIGVudGl0eSBwcm9wZXJ0aWVzIG11c3QgYmUgJ3B1YmxpYycgb3IgJ3Byb3RlY3RlZCcgKi8KLQkJcHVibGljIHZvaWQgc2V0TWV0aG9kVmlzaWJpbGl0eShpbnQgbWV0aG9kVmlzaWJpbGl0eSkgewotCQkJc3dpdGNoIChtZXRob2RWaXNpYmlsaXR5KSB7Ci0JCQkJY2FzZSBQUk9URUNURUQ6Ci0JCQkJY2FzZSBQVUJMSUM6Ci0JCQkJCXRoaXMubWV0aG9kVmlzaWJpbGl0eSA9IG1ldGhvZFZpc2liaWxpdHk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgbWV0aG9kIHZpc2liaWxpdHk6ICIgKyBtZXRob2RWaXNpYmlsaXR5KTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgbWV0aG9kVmlzaWJpbGl0eSgpIHsKLQkJCXN3aXRjaCAodGhpcy5tZXRob2RWaXNpYmlsaXR5KSB7Ci0JCQkJY2FzZSBQUk9URUNURUQ6Ci0JCQkJCXJldHVybiAicHJvdGVjdGVkIjsKLQkJCQljYXNlIFBVQkxJQzoKLQkJCQkJcmV0dXJuICJwdWJsaWMiOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgbWV0aG9kIHZpc2liaWxpdHk6ICIgKyB0aGlzLm1ldGhvZFZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyhib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMpIHsKLQkJCXRoaXMuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyA9IGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKGJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IpIHsKLQkJCXRoaXMuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IgPSBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNlcmlhbGl6YWJsZSgpIHsKLQkJCXJldHVybiB0aGlzLnNlcmlhbGl6YWJsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRTZXJpYWxpemFibGUoYm9vbGVhbiBzZXJpYWxpemFibGUpIHsKLQkJCXRoaXMuc2VyaWFsaXphYmxlID0gc2VyaWFsaXphYmxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRChib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCkgewotCQkJdGhpcy5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQgPSBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKGJvb2xlYW4gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSykgewotCQkJdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEsoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEs7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSyhib29sZWFuIGdlbmVyYXRlSWRDbGFzc0ZvckNvbXBvdW5kUEspIHsKLQkJCXRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyA9ICEgZ2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSzsKLQkJfQotCi0JCS8qKgotCQkgKiBrZXkgPSB0YWJsZQotCQkgKiB2YWx1ZSA9IHVzZXItc3VwcGxpZWQgb3ZlcnJpZGUgZW50aXR5IG5hbWUKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0T3ZlcnJpZGVFbnRpdHlOYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLmdldCh0YWJsZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0T3ZlcnJpZGVFbnRpdHlOYW1lKFRhYmxlIHRhYmxlLCBTdHJpbmcgb3ZlcnJpZGVFbnRpdHlOYW1lKSB7Ci0JCQl0aGlzLm92ZXJyaWRlRW50aXR5TmFtZXMucHV0KHRhYmxlLCBvdmVycmlkZUVudGl0eU5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyT3ZlcnJpZGVFbnRpdHlOYW1lcygpIHsKLQkJCXRoaXMub3ZlcnJpZGVFbnRpdHlOYW1lcy5jbGVhcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRlRW50aXR5TmFtZXMoTWFwPFRhYmxlLCBTdHJpbmc+IG92ZXJyaWRlRW50aXR5TmFtZXMpIHsKLQkJCXRoaXMuY2xlYXJPdmVycmlkZUVudGl0eU5hbWVzKCk7Ci0JCQlmb3IgKE1hcC5FbnRyeTxUYWJsZSwgU3RyaW5nPiBlbnRyeSA6IG92ZXJyaWRlRW50aXR5TmFtZXMuZW50cnlTZXQoKSkgewotCQkJCXRoaXMuc2V0T3ZlcnJpZGVFbnRpdHlOYW1lKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbmZpZyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPdmVyd3JpdGVDb25maXJtZXIgewotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBnZW5lcmF0b3Igc2hvdWxkIG92ZXJ3cml0ZSB0aGUgc3BlY2lmaWVkCi0JCSAqIGZpbGUuCi0JCSAqLwotCQlib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgY2xhc3NOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuU2NvcGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViMDdkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLWNsYXNzIEdlblNjb3BlIHsKLQlwcml2YXRlIGZpbmFsIE1hcDxUYWJsZSwgR2VuVGFibGU+IGdlblRhYmxlcyA9IG5ldyBIYXNoTWFwPFRhYmxlLCBHZW5UYWJsZT4oKTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JR2VuU2NvcGUoQ29sbGVjdGlvbjxUYWJsZT4gdGFibGVzLCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKHRhYmxlcywgZW50aXR5Q29uZmlnLCBwcm9ncmVzc01vbml0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NhbmNlbGVkKCkgewotCQlpZiAodGhpcy5wcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKENvbGxlY3Rpb248VGFibGU+IHRhYmxlcywgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIiIsIDEwMDApOwotCQkJdGhpcy5idWlsZEdlblRhYmxlcyh0YWJsZXMsIGVudGl0eUNvbmZpZyk7Ci0JCQljaGVja0NhbmNlbGVkKCk7Ci0JCQl0aGlzLmNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKTsKLQkJCWNoZWNrQ2FuY2VsZWQoKTsKLQkJCXRoaXMuY29uZmlndXJlTWFueVRvT25lUmVsYXRpb25zKCk7Ci0JCQljaGVja0NhbmNlbGVkKCk7Ci0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZXMoKTsKLQkJCWNoZWNrQ2FuY2VsZWQoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEdlblRhYmxlcyhDb2xsZWN0aW9uPFRhYmxlPiB0YWJsZXMsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnKSB7Ci0JCWludCBzaXplID0gdGFibGVzLnNpemUoKTsKLQkJLy8gcGFzcyBhcm91bmQgYSBncm93aW5nIGxpc3Qgb2YgdGhlIGVudGl0eSBuYW1lcyBzbyB3ZSBjYW4gYXZvaWQgZHVwbGljYXRlcwotCQlTZXQ8U3RyaW5nPiBlbnRpdHlOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oc2l6ZSk7Ci0JCWZvciAoVGFibGUgdGFibGUgOiB0YWJsZXMpIHsKLQkJCXRoaXMuYnVpbGRHZW5UYWJsZSh0YWJsZSwgZW50aXR5Q29uZmlnLCBlbnRpdHlOYW1lcyk7Ci0JCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQoNTAvc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRHZW5UYWJsZShUYWJsZSB0YWJsZSwgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIENvbGxlY3Rpb248U3RyaW5nPiBlbnRpdHlOYW1lcykgewotCQl0aGlzLmdlblRhYmxlcy5wdXQodGFibGUsIG5ldyBHZW5UYWJsZSh0aGlzLCB0YWJsZSwgZW50aXR5Q29uZmlnLCBlbnRpdHlOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIGZpbmQgYWxsIHRoZSAiam9pbiIgdGFibGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCWludCB0YWJsZXNTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy50YWJsZXMoKSk7Ci0KLQkJLy9maXJzdCB0aW1lIHRha2VzIHRoZSBsb25nZXN0LCBzaG91bGQgd2UgdGFrZSB0aGF0IGludG8gYWNjb3VudD8KLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQljaGVja0NhbmNlbGVkKCk7Ci0JCQlzdHJlYW0ubmV4dCgpLmNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg3NTAvdGFibGVzU2l6ZSk7Ci0JCX0KLQkJLy8gcmV2ZXJ0IGFueSAiam9pbiIgdGFibGUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgdGFibGUgYmFjayB0byBhbiAiZW50aXR5IiB0YWJsZQotCQlTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZFRhYmxlcygpOwotCQl0YWJsZXNTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5qb2luVGFibGVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLmpvaW5UYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlHZW5UYWJsZSBqb2luR2VuVGFibGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHJlZmVyZW5jZWRUYWJsZXMuY29udGFpbnMoam9pbkdlblRhYmxlKSkgewotCQkJCWpvaW5HZW5UYWJsZS5jbGVhckpvaW5UYWJsZVJlbGF0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQoNTAvdGFibGVzU2l6ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBmaW5kIGFsbCB0aGUgbWFueS10by1vbmUgYW5kIG9uZS10by1tYW55IHJlbGF0aW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVNYW55VG9PbmVSZWxhdGlvbnMoKSB7Ci0JCWludCB0YWJsZXNTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5lbnRpdHlUYWJsZXMoKSk7Ci0JCWZvciAoSXRlcmF0b3I8R2VuVGFibGU+IHN0cmVhbSA9IHRoaXMuZW50aXR5VGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5jb25maWd1cmVNYW55VG9PbmVSZWxhdGlvbnMoKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg1MC90YWJsZXNTaXplKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRldGVybWluZSBhbGwgdGhlIEphdmEgZmllbGQgbmFtZXMgdXAtZnJvbnQgYmVjYXVzZSB3ZSB3aWxsCi0JICogbmVlZCB0aGVtIGZvciB0aGluZ3MgbGlrZSAnbWFwcGVkQnknIGFubm90YXRpb24gZWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlRmllbGROYW1lcygpIHsKLQkJaW50IHRhYmxlc1NpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmVudGl0eVRhYmxlcygpKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5lbnRpdHlUYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmNvbmZpZ3VyZUZpZWxkTmFtZXMoKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg1MC90YWJsZXNTaXplKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gb25seSB0aGUgZ2VuIHRhYmxlcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgZ2VuZXJhdGluZwotCSAqIGVudGl0aWVzIChpLmUuIGV4Y2x1ZGUgdGhlICJqb2luIiB0YWJsZXMpCi0JICovCi0JSXRlcmF0b3I8R2VuVGFibGU+IGVudGl0eVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxHZW5UYWJsZT4odGhpcy50YWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gISAoKEdlblRhYmxlKSBuZXh0KS5pc0pvaW5UYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCWludCBudW1FbnRpdHlUYWJsZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlUYWJsZXMoKSk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiB0aGUgZ2VuIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0YWJsZQotCSAqLwotCUdlblRhYmxlIGdlblRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlcy5nZXQodGFibGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBBUEkgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJdGVyYXRvcjxHZW5UYWJsZT4gdGFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZW5UYWJsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gb25seSB0aGUgImpvaW4iIGdlbiB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdlblRhYmxlPiBqb2luVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEdlblRhYmxlPih0aGlzLnRhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiAoKEdlblRhYmxlKSBuZXh0KS5pc0pvaW5UYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgc2V0IG9mIHRoZSB0YWJsZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBvdGhlciB0YWJsZXMKLQkgKiBpbiB0aGUgc2NvcGUKLQkgKi8KLQlwcml2YXRlIFNldDxHZW5UYWJsZT4gYnVpbGRSZWZlcmVuY2VkVGFibGVzKCkgewotCQlpbnQgc2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMudGFibGVzKCkpOwotCQlTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMgPSBuZXcgSGFzaFNldDxHZW5UYWJsZT4odGhpcy5nZW5UYWJsZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmFkZFJlZmVyZW5jZWRUYWJsZXNUbyhyZWZlcmVuY2VkVGFibGVzKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg1MC9zaXplKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZFRhYmxlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3ZmQzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0vKioKLSAqIGFzc29jaWF0ZSBhIHRhYmxlIHdpdGggdGhlIHZhcmlvdXMgcmVsYXRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4KLSAqIGdlbmVyYXRpbmcgdGhlIGVudGl0eQotICovCi1jbGFzcyBHZW5UYWJsZSB7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5TY29wZSBzY29wZTsKLQlwcml2YXRlIGZpbmFsIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgZmluYWwgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWc7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW50aXR5TmFtZTsKLQlwcml2YXRlIE1hbnlUb01hbnlSZWxhdGlvbiBqb2luVGFibGVSZWxhdGlvbjsKLQlwcml2YXRlIENvbGxlY3Rpb248TWFueVRvTWFueVJlbGF0aW9uPiBvd25lZE1hbnlUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1hbnlUb01hbnlSZWxhdGlvbj4oKTsKLQlwcml2YXRlIENvbGxlY3Rpb248TWFueVRvTWFueVJlbGF0aW9uPiBub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1hbnlUb01hbnlSZWxhdGlvbj4oKTsKLQlwcml2YXRlIENvbGxlY3Rpb248TWFueVRvT25lUmVsYXRpb24+IG1hbnlUb09uZVJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWFueVRvT25lUmVsYXRpb24+KCk7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9uZVRvTWFueVJlbGF0aW9uPiBvbmVUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9uZVRvTWFueVJlbGF0aW9uPigpOwotCXByaXZhdGUgU2V0PENvbHVtbj4gZm9yZWlnbktleUNvbHVtbnMgPSBuZXcgSGFzaFNldDxDb2x1bW4+KCk7Ci0KLQkvLyBrZXk9Y29sdW1uL3JlbGF0aW9uOyB2YWx1ZT1uYW1lCi0JcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LCBTdHJpbmc+IGZpZWxkTmFtZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFN0cmluZz4oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFTUJFRERFRF9JRF9WSVJUVUFMX0NPTFVNTiA9IG5ldyBPYmplY3QoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JR2VuVGFibGUoR2VuU2NvcGUgc2NvcGUsIFRhYmxlIHRhYmxlLCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZywgQ29sbGVjdGlvbjxTdHJpbmc+IGVudGl0eU5hbWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQl0aGlzLmVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZzsKLQkJdGhpcy5lbnRpdHlOYW1lID0gdGhpcy5idWlsZEVudGl0eU5hbWUoZW50aXR5TmFtZXMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRW50aXR5TmFtZShDb2xsZWN0aW9uPFN0cmluZz4gZW50aXR5TmFtZXMpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnRhYmxlLnNob3J0SmF2YUNsYXNzTmFtZSgpOwotCQlTdHJpbmcgb3ZlcnJpZGVFbnRpdHlOYW1lID0gdGhpcy5lbnRpdHlDb25maWcuZ2V0T3ZlcnJpZGVFbnRpdHlOYW1lKHRoaXMudGFibGUpOwotCQlpZiAob3ZlcnJpZGVFbnRpdHlOYW1lID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmVudGl0eUNvbmZpZy5jb252ZXJ0VG9DYW1lbENhc2UoKSkgewotCQkJCW5hbWUgPSBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShuYW1lKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBvdmVycmlkZUVudGl0eU5hbWU7Ci0JCX0KLQkJbmFtZSA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShuYW1lLCBlbnRpdHlOYW1lcyk7Ci0JCWVudGl0eU5hbWVzLmFkZChuYW1lKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhY2thZ2UgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIGRldGVybWluZSB3aGV0aGVyIHRoZSB0YWJsZSBpcyBhICJqb2luIiB0YWJsZSB3aXRoaW4gdGhlIHRhYmxlJ3Mgc2NvcGUKLQkgKi8KLQl2b2lkIGNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpICE9IDIpIHsKLQkJCS8vIHRoZSB0YWJsZSBtdXN0IGhhdmUgZXhhY3RseSAyIGZvcmVpZ24ga2V5cwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLnRhYmxlLmNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoICEgdGhpcy50YWJsZS5mb3JlaWduS2V5Q29sdW1uc0NvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0JCQkJLy8gYWxsIHRoZSB0YWJsZSdzIGNvbHVtbnMgbXVzdCBiZWxvbmcgdG8gb25lIChvciBib3RoKSBvZiB0aGUgMiBmb3JlaWduIGtleXMKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3I8Rm9yZWlnbktleT4gZktleXMgPSB0aGlzLnRhYmxlLmZvcmVpZ25LZXlzKCk7Ci0JCUZvcmVpZ25LZXkgb3duaW5nRksgPSBmS2V5cy5uZXh0KCk7Ci0JCUZvcmVpZ25LZXkgbm9uT3duaW5nRksgPSBmS2V5cy5uZXh0KCk7Ci0JCUdlblRhYmxlIG93bmluZ1RhYmxlID0gdGhpcy5zY29wZS5nZW5UYWJsZShvd25pbmdGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0JCUdlblRhYmxlIG5vbk93bmluZ1RhYmxlID0gdGhpcy5zY29wZS5nZW5UYWJsZShub25Pd25pbmdGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0JCWlmICgob3duaW5nVGFibGUgPT0gbnVsbCkgfHwgKG5vbk93bmluZ1RhYmxlID09IG51bGwpKSB7Ci0JCQkvLyBib3RoIHRhYmxlcyBtdXN0IGJlIGluIHRoZSBzY29wZQotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuam9pblRhYmxlUmVsYXRpb24gPSBuZXcgTWFueVRvTWFueVJlbGF0aW9uKHRoaXMsIG93bmluZ0ZLLCBvd25pbmdUYWJsZSwgbm9uT3duaW5nRkssIG5vbk93bmluZ1RhYmxlKTsKLQl9Ci0KLQl2b2lkIGFkZFJlZmVyZW5jZWRUYWJsZXNUbyhTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMpIHsKLQkJZm9yIChJdGVyYXRvcjxGb3JlaWduS2V5PiBzdHJlYW0gPSB0aGlzLnRhYmxlLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleSBmayA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlHZW5UYWJsZSBnZW5UYWJsZSA9IHRoaXMuc2NvcGUuZ2VuVGFibGUoZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQkJaWYgKGdlblRhYmxlICE9IG51bGwpIHsKLQkJCQlyZWZlcmVuY2VkVGFibGVzLmFkZChnZW5UYWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFySm9pblRhYmxlUmVsYXRpb24oKSB7Ci0JCXRoaXMuam9pblRhYmxlUmVsYXRpb24uY2xlYXIoKTsKLQkJdGhpcy5qb2luVGFibGVSZWxhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogZmluZCAiaW4tc2NvcGUiIGZvcmVpZ24ga2V5cwotCSAqLwotCXZvaWQgY29uZmlndXJlTWFueVRvT25lUmVsYXRpb25zKCkgewotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXk+IHN0cmVhbSA9IHRoaXMudGFibGUuZm9yZWlnbktleXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlGb3JlaWduS2V5IGZrID0gc3RyZWFtLm5leHQoKTsKLQkJCUdlblRhYmxlIHJlZmVyZW5jZWR0YWJsZSA9IHRoaXMuc2NvcGUuZ2VuVGFibGUoZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQkJaWYgKHJlZmVyZW5jZWR0YWJsZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7ICAvLyBza2lwIHRvIG5leHQgRksKLQkJCX0KLQkJCXRoaXMubWFueVRvT25lUmVsYXRpb25zLmFkZChuZXcgTWFueVRvT25lUmVsYXRpb24odGhpcywgZmssIHJlZmVyZW5jZWR0YWJsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbm93IHRoYXQgYWxsIHRoZSByZWxhdGlvbnMgYXJlIGluIHBsYWNlLCB3ZSBjYW4gY29uZmlndXJlIHRoZSBKYXZhCi0JICogZmllbGQgbmFtZXMKLQkgKi8KLQl2b2lkIGNvbmZpZ3VyZUZpZWxkTmFtZXMoKSB7Ci0JCVNldDxDb2x1bW4+IGNvbHVtbnMgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMudGFibGUuY29sdW1ucygpKTsKLQkJaWYgKCh0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMSkgJiYgdGhpcy5lbnRpdHlDb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQkvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgYW4gRW1iZWRkZWRJZCBmaWVsZCwgYWRkIGl0IHRvCi0JCQkvLyAnZmllbGROYW1lcycgc28gd2UgZG9uJ3QgY29sbGlkZSB3aXRoIGl0IGxhdGVyLCB3aGVuIGdlbmVyYXRpbmcKLQkJCS8vIGZpZWxkIG5hbWVzIGZvciB0aGUgY29sdW1ucyBldGMuCi0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShFTUJFRERFRF9JRF9WSVJUVUFMX0NPTFVNTiwgInBrIik7Ci0JCX0KLQkJdGhpcy5jb25maWd1cmVNYW55VG9PbmVGaWVsZE5hbWVzKGNvbHVtbnMpOwotCQl0aGlzLmNvbmZpZ3VyZUJhc2ljRmllbGROYW1lcyhjb2x1bW5zKTsKLQkJdGhpcy5jb25maWd1cmVPbmVUb01hbnlGaWVsZE5hbWVzKCk7Ci0JCXRoaXMuY29uZmlndXJlT3duZWRNYW55VG9NYW55RmllbGROYW1lcygpOwotCQl0aGlzLmNvbmZpZ3VyZU5vbk93bmVkTWFueVRvTWFueUZpZWxkTmFtZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdGFibGUncyBwcmltYXJ5IGtleQotCSAqIGJ1dCBhcmUgYWxzbyBwYXJ0IG9mIGFuICJpbi1zY29wZSIgZm9yZWlnbiBrZXkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uPiByZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbj4odGhpcy50YWJsZS5wcmltYXJ5S2V5Q29sdW1ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgY29sdW1uKSB7Ci0JCQkJcmV0dXJuIEdlblRhYmxlLnRoaXMuZm9yZWlnbktleUNvbHVtbnNDb250YWlucygoQ29sdW1uKSBjb2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1ucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5Ci0JICogYnV0IGFyZSBOT1QgcGFydCBvZiBhbnkgImluLXNjb3BlIiBmb3JlaWduIGtleQotCSAqLwotCUl0ZXJhdG9yPENvbHVtbj4gd3JpdGFibGVQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxDb2x1bW4+KHRoaXMudGFibGUucHJpbWFyeUtleUNvbHVtbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNvbHVtbikgewotCQkJCXJldHVybiAhIEdlblRhYmxlLnRoaXMuZm9yZWlnbktleUNvbHVtbnNDb250YWlucygoQ29sdW1uKSBjb2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1ucyB0aGF0IE5FSVRIRVIgcGFydCBvZiB0aGUgdGFibGUncyBwcmltYXJ5IGtleQotCSAqIE5PUiBwYXJ0IG9mIGFueSBmb3JlaWduIGtleQotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IG5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Q29sdW1uPih0aGlzLnRhYmxlLmNvbHVtbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNvbHVtbikgewotCQkJCXJldHVybiAhIChHZW5UYWJsZS50aGlzLnByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoKENvbHVtbikgY29sdW1uKQotCQkJCQkJfHwgR2VuVGFibGUudGhpcy5mb3JlaWduS2V5Q29sdW1uc0NvbnRhaW5zKChDb2x1bW4pIGNvbHVtbikpOwotCQkJfQotCQl9OwotCX0KLQotCVRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5TmFtZTsKLQl9Ci0KLQlib29sZWFuIGlzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVSZWxhdGlvbiAhPSBudWxsOwotCX0KLQotCXZvaWQgYWRkT3duZWRNYW55VG9NYW55UmVsYXRpb24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zLmFkZChyZWxhdGlvbik7Ci0JfQotCi0Jdm9pZCByZW1vdmVPd25lZE1hbnlUb01hbnlSZWxhdGlvbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5vd25lZE1hbnlUb01hbnlSZWxhdGlvbnMucmVtb3ZlKHJlbGF0aW9uKTsKLQl9Ci0KLQl2b2lkIGFkZE5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5hZGQocmVsYXRpb24pOwotCX0KLQotCXZvaWQgcmVtb3ZlTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zLnJlbW92ZShyZWxhdGlvbik7Ci0JfQotCi0Jdm9pZCBhZGRPbmVUb01hbnlSZWxhdGlvbihPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm9uZVRvTWFueVJlbGF0aW9ucy5hZGQocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBqYXZhRmllbGROYW1lKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5qYXZhRmllbGROYW1lKCk7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvT25lUmVsYXRpb24+IG1hbnlUb09uZVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8T25lVG9NYW55UmVsYXRpb24+IG9uZVRvTWFueVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMub25lVG9NYW55UmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBvd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5pdGVyYXRvcigpOwotCX0KLQotCUl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gbm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUga2V5IGNhbiBiZSBhIGNvbHVtbiBvciByZWxhdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZpZWxkTmFtZUZvckludGVybmFsKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZXMuZ2V0KG8pOwotCX0KLQotCS8qKgotCSAqIHRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB3ZSBkb24ndCB3YW50IGFuIGVtYmVkZGVkIGlkIGZpZWxkCi0JICovCi0JU3RyaW5nIGZpZWxkTmFtZUZvckVtYmVkZGVkSWQoKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZUZvckludGVybmFsKEVNQkVEREVEX0lEX1ZJUlRVQUxfQ09MVU1OKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZmllbGROYW1lRm9ySW50ZXJuYWwoY29sdW1uKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZUZvckludGVybmFsKHJlbGF0aW9uKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZUZvckludGVybmFsKHJlbGF0aW9uKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQlyZXR1cm4gdGhpcy5maWVsZE5hbWVGb3JJbnRlcm5hbChyZWxhdGlvbik7Ci0JfQotCi0JU3RyaW5nIG5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIHdoaWxlIHdlIGFyZSBmaWd1cmluZyBvdXQgdGhlIG5hbWVzIGZvciB0aGUgbToxIGZpZWxkcywgcmVtb3ZlIGZyb20gdGhlCi0JICogc3BlY2lmaWVkIHNldCBvZiBjb2x1bW5zIHRoZSBjb2x1bW5zIHRoYXQgYXJlIG9ubHkgcGFydCBvZiB0aGUgZm9yZWlnbiBrZXlzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU1hbnlUb09uZUZpZWxkTmFtZXMoU2V0PENvbHVtbj4gY29sdW1ucykgewotCQlmb3IgKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uIDogdGhpcy5tYW55VG9PbmVSZWxhdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoY29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLm5vblByaW1hcnlLZXlCYXNlQ29sdW1ucygpKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5mb3JlaWduS2V5Q29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLmJhc2VDb2x1bW5zKCkpOwotCQkJcmVsYXRpb24uc2V0TWFwcGVkQnkodGhpcy5jb25maWd1cmVGaWVsZE5hbWUocmVsYXRpb24sIHJlbGF0aW9uLmphdmFGaWVsZE5hbWUoKSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29uZmlndXJlRmllbGROYW1lKE9iamVjdCBvLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCWZpZWxkTmFtZSA9IHRoaXMuY2FtZWxDYXNlKGZpZWxkTmFtZSk7Ci0JCWZpZWxkTmFtZSA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9yKGZpZWxkTmFtZSwgdGhpcy5maWVsZE5hbWVzLnZhbHVlcygpKTsKLQkJdGhpcy5maWVsZE5hbWVzLnB1dChvLCBmaWVsZE5hbWUpOwotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNhbWVsQ2FzZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlDb25maWcuY29udmVydFRvQ2FtZWxDYXNlKCkgPwotCQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobmFtZSwgZmFsc2UpICAvLyBmYWxzZSA9IGRvbid0IGNhcGl0YWxpemUgZmlyc3QgbGV0dGVyCi0JCToKLQkJCW5hbWU7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB1bmlxdWUgZmllbGQgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAiYmFzaWMiIGNvbHVtbnMsCi0JICogY2hlY2tpbmcgZm9yIG5hbWUgY29sbGlzaW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVCYXNpY0ZpZWxkTmFtZXMoU2V0PENvbHVtbj4gY29sdW1ucykgewotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiBjb2x1bW5zKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShjb2x1bW4sIGNvbHVtbi5qYXZhRmllbGROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU9uZVRvTWFueUZpZWxkTmFtZXMoKSB7Ci0JCWZvciAoT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24gOiB0aGlzLm9uZVRvTWFueVJlbGF0aW9ucykgewotCQkJdGhpcy5jb25maWd1cmVGaWVsZE5hbWUocmVsYXRpb24sIHJlbGF0aW9uLmphdmFGaWVsZE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlT3duZWRNYW55VG9NYW55RmllbGROYW1lcygpIHsKLQkJZm9yIChNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24gOiB0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucykgewotCQkJcmVsYXRpb24uc2V0TWFwcGVkQnkodGhpcy5jb25maWd1cmVGaWVsZE5hbWUocmVsYXRpb24sIHJlbGF0aW9uLmphdmFGaWVsZE5hbWVGb3IodGhpcykpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVOb25Pd25lZE1hbnlUb01hbnlGaWVsZE5hbWVzKCkgewotCQlmb3IgKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiA6IHRoaXMubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShyZWxhdGlvbiwgcmVsYXRpb24uamF2YUZpZWxkTmFtZUZvcih0aGlzKSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGZvcmVpZ25LZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29sdW1ucy5jb250YWlucyhjb2x1bW4pOwotCX0KLQotCWJvb2xlYW4gcHJpbWFyeUtleUNvbHVtbnNDb250YWlucyhDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoY29sdW1uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvTWFueVJlbGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb01hbnlSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc2MDg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvTWFueVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkZvcmVpZ25LZXk7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgaXMgc2hhcmVkIGJ5IHRoZSB0d28gZ2VuIHRhYmxlcyB0aGF0IG1ha2UgdXAgdGhlIHJlbGF0aW9uLgotICogVXBvbiBjb25zdHJ1Y3Rpb24sICdtYXBwZWRCeScgd2lsbCBiZSAnbnVsbCcuIFRoZSBmaXJzdCBnZW4gdGFibGUgdG8gYmUKLSAqIHVzZWQgdG8gZ2VuZXJhdGUgYW4gZW50aXR5IHdpbGwgZmlsbCBpbiAnbWFwcGVkQnknIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0gKiBmaWVsZC9wcm9wZXJ0eSBuYW1lLgotICovCi1jbGFzcyBNYW55VG9NYW55UmVsYXRpb24gewotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgam9pblRhYmxlOwotCXByaXZhdGUgZmluYWwgRm9yZWlnbktleSBvd25pbmdGb3JlaWduS2V5OwotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgb3duaW5nVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBGb3JlaWduS2V5IG5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBub25Pd25pbmdUYWJsZTsKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQotCi0JTWFueVRvTWFueVJlbGF0aW9uKEdlblRhYmxlIGpvaW5UYWJsZSwgRm9yZWlnbktleSBvd25pbmdGb3JlaWduS2V5LCBHZW5UYWJsZSBvd25pbmdUYWJsZSwgRm9yZWlnbktleSBub25Pd25pbmdGb3JlaWduS2V5LCBHZW5UYWJsZSBub25Pd25pbmdUYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQotCQl0aGlzLm93bmluZ0ZvcmVpZ25LZXkgPSBvd25pbmdGb3JlaWduS2V5OwotCQl0aGlzLm93bmluZ1RhYmxlID0gb3duaW5nVGFibGU7Ci0JCW93bmluZ1RhYmxlLmFkZE93bmVkTWFueVRvTWFueVJlbGF0aW9uKHRoaXMpOwotCi0JCXRoaXMubm9uT3duaW5nRm9yZWlnbktleSA9IG5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JCXRoaXMubm9uT3duaW5nVGFibGUgPSBub25Pd25pbmdUYWJsZTsKLQkJbm9uT3duaW5nVGFibGUuYWRkTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JfQotCi0JRm9yZWlnbktleSBnZXRPd25pbmdGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdGb3JlaWduS2V5OwotCX0KLQotCUdlblRhYmxlIGdldE93bmluZ1RhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdUYWJsZTsKLQl9Ci0KLQlGb3JlaWduS2V5IGdldE5vbk93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Tm9uT3duaW5nVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ1RhYmxlOwotCX0KLQotCXByaXZhdGUgR2VuVGFibGUgb3RoZXJUYWJsZShHZW5UYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gKHRhYmxlID09IHRoaXMub3duaW5nVGFibGUpID8gdGhpcy5ub25Pd25pbmdUYWJsZSA6IHRoaXMub3duaW5nVGFibGU7Ci0JfQotCi0JU3RyaW5nIGphdmFGaWVsZE5hbWVGb3IoR2VuVGFibGUgdGFibGUpIHsKLQkJLy8gVE9ETyBpMThuPwotCQlyZXR1cm4gdGhpcy5vdGhlclRhYmxlKHRhYmxlKS5qYXZhRmllbGROYW1lKCkgKyAiX2NvbGxlY3Rpb24iOwotCX0KLQotCXZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMub3duaW5nVGFibGUucmVtb3ZlT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JCXRoaXMubm9uT3duaW5nVGFibGUucmVtb3ZlTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JfQotCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JfQotCi0JU3RyaW5nIG93bmluZ0VudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmluZ1RhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLQlTdHJpbmcgbm9uT3duaW5nRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCWJvb2xlYW4gam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLm5hbWUoKS5lcXVhbHModGhpcy5nZXRPd25pbmdUYWJsZSgpLm5hbWUoKSArICJfIiArIHRoaXMuZ2V0Tm9uT3duaW5nVGFibGUoKS5uYW1lKCkpOwotCX0KLQotCWJvb2xlYW4gam9pbkNvbHVtbnNJc0RlZmF1bHRGb3IoU3RyaW5nIGphdmFGaWVsZE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMub3duaW5nRm9yZWlnbktleS5pc0RlZmF1bHRGb3IoamF2YUZpZWxkTmFtZSk7Ci0JfQotCi0JYm9vbGVhbiBpbnZlcnNlSm9pbkNvbHVtbnNJc0RlZmF1bHRGb3IoU3RyaW5nIGphdmFGaWVsZE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nRm9yZWlnbktleS5pc0RlZmF1bHRGb3IoamF2YUZpZWxkTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb09uZVJlbGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb09uZVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMzAxOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkZvcmVpZ25LZXk7Ci0KLWNsYXNzIE1hbnlUb09uZVJlbGF0aW9uIHsKLQlwcml2YXRlIGZpbmFsIEdlblRhYmxlIGJhc2VUYWJsZTsgIC8vIHRoZSAibWFueSIgc2lkZQotCXByaXZhdGUgZmluYWwgRm9yZWlnbktleSBmb3JlaWduS2V5OwotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlOyAgLy8gdGhlICJvbmUiIHNpZGUKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQotCi0JTWFueVRvT25lUmVsYXRpb24oR2VuVGFibGUgYmFzZVRhYmxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXksIEdlblRhYmxlIHJlZmVyZW5jZWRUYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmJhc2VUYWJsZSA9IGJhc2VUYWJsZTsKLQkJdGhpcy5mb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSByZWZlcmVuY2VkVGFibGU7Ci0JCXJlZmVyZW5jZWRUYWJsZS5hZGRPbmVUb01hbnlSZWxhdGlvbihuZXcgT25lVG9NYW55UmVsYXRpb24odGhpcykpOwotCX0KLQotCUdlblRhYmxlIGdldEJhc2VUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVRhYmxlOwotCX0KLQotCUZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleTsKLQl9Ci0KLQlHZW5UYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQlTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleS5qYXZhRmllbGROYW1lKCk7Ci0JfQotCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JfQotCi0JU3RyaW5nIGJhc2VFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5iYXNlVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCVN0cmluZyByZWZlcmVuY2VkRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZFRhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT25lVG9NYW55UmVsYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT25lVG9NYW55UmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1NmQwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09uZVRvTWFueVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWNsYXNzIE9uZVRvTWFueVJlbGF0aW9uIHsKLQlwcml2YXRlIGZpbmFsIE1hbnlUb09uZVJlbGF0aW9uIG1hbnlUb09uZVJlbGF0aW9uOwotCi0JT25lVG9NYW55UmVsYXRpb24oTWFueVRvT25lUmVsYXRpb24gbWFueVRvT25lUmVsYXRpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tYW55VG9PbmVSZWxhdGlvbiA9IG1hbnlUb09uZVJlbGF0aW9uOwotCX0KLQotCU1hbnlUb09uZVJlbGF0aW9uIGdldE1hbnlUb09uZVJlbGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJLy8gVE9ETyBpMThuPwotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbi5nZXRCYXNlVGFibGUoKS5qYXZhRmllbGROYW1lKCkgKyAiX2NvbGxlY3Rpb24iOwotCX0KLQotCVN0cmluZyBtYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb24uZ2V0TWFwcGVkQnkoKTsKLQl9Ci0KLQlTdHJpbmcgcmVmZXJlbmNlZEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1hbnlUb09uZVJlbGF0aW9uLmJhc2VFbnRpdHlOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvUGFja2FnZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjc0NTUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvUGFja2FnZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuZXJhdG9yLk92ZXJ3cml0ZUNvbmZpcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogVGhpcyBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBhIHBhY2thZ2Ugb2YgZW50aXRpZXMgZm9yIGEgc2V0IG9mIHRhYmxlcy4KLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VHZW5lcmF0b3IgewotCXByaXZhdGUgZmluYWwgQ29uZmlnIGNvbmZpZzsKLQlwcml2YXRlIGZpbmFsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnOwotCXByaXZhdGUgZmluYWwgR2VuU2NvcGUgc2NvcGU7Ci0JcHJpdmF0ZSBmaW5hbCBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyOwotCXByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUVudGl0aWVzKENvbmZpZyBjb25maWcsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLCBDb2xsZWN0aW9uPFRhYmxlPiB0YWJsZXMsIE92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoKGNvbmZpZyA9PSBudWxsKSB8fCAoZW50aXR5Q29uZmlnID09IG51bGwpIHx8ICh0YWJsZXMgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTAwMCk7Ci0JCQluZXcgUGFja2FnZUdlbmVyYXRvcihjb25maWcsIGVudGl0eUNvbmZpZywgdGFibGVzLCBvdmVyd3JpdGVDb25maXJtZXIsIG1vbml0b3IpLmdlbmVyYXRlRW50aXRpZXMoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFBhY2thZ2VHZW5lcmF0b3IoQ29uZmlnIGNvbmZpZywgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIENvbGxlY3Rpb248VGFibGU+IHRhYmxlcywgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZzsKLQkJdGhpcy5zY29wZSA9IG5ldyBHZW5TY29wZSh0YWJsZXMsIGVudGl0eUNvbmZpZywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA4MDApKTsKLQkJdGhpcy5vdmVyd3JpdGVDb25maXJtZXIgPSBvdmVyd3JpdGVDb25maXJtZXI7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRW50aXRpZXMoKSB7Ci0JCWludCBzaXplID0gdGhpcy5zY29wZS5udW1FbnRpdHlUYWJsZXMoKTsKLQkJaW50IHRpY2tzID0gMjAwL3NpemU7Ci0JCWZvciAoSXRlcmF0b3I8R2VuVGFibGU+IHN0cmVhbSA9IHRoaXMuc2NvcGUuZW50aXR5VGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJY2hlY2tDYW5jZWxlZCgpOwotCQkJdGhpcy5idWlsZEVudGl0eShzdHJlYW0ubmV4dCgpLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHRoaXMubW9uaXRvciwgdGlja3MpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NhbmNlbGVkKCkgewotCQlpZiAodGhpcy5tb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0JCQotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBidWlsZEVudGl0eShHZW5UYWJsZSBnZW5UYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUVudGl0eUdlbmVyYXRvci5nZW5lcmF0ZUVudGl0eSh0aGlzLmVudGl0eUNvbmZpZywgdGhpcy5jb25maWcuZ2V0UGFja2FnZUZyYWdtZW50KCksIGdlblRhYmxlLCBvdmVyd3JpdGVDb25maXJtZXIsIG1vbml0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWcgewotCQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50OwotCi0JCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJCXRoaXMucGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50OwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTdjNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlZjllMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzg5OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MjUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDljMTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6MDEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTEyMWE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlQbHVnaW4KLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LnVpLAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gb3JnLmVjbGlwc2UuanB0LmdlbiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmdlbmVyaWM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLnN0cnVjdHVyZTsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZnM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByb3BlcnRpZXM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3czsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLnN0cnVjdHVyZTsgeC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTczYmRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWExYzM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4MjdiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LnVpIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNzY4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9qcGFfZmFjZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRhODA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX2RldGFpbHMuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODAxMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3N0cnVjdHVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2Jhc2ljLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2Jhc2ljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0N2Q3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9iYXNpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRhYmxlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2Zjc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQtaWQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQtaWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM4ZTIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLWlkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTY2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHktbWFwcGluZ3MuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LW1hcHBpbmdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0OWM5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHktbWFwcGluZ3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDZmNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2lkLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2lkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwNWVjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9pZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW1hbnkuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4ODViMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW1hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1vbmUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTFlMmI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMzc2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYXBwZWQtc3VwZXJjbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE5YzIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmcuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NDc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1tYW55LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5MDAyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tbWFueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tb25lLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzhlYzM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS11bml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjNDVmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS11bml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbmNlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNjE2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi90cmFuc2llbnQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1ZDgzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi90cmFuc2llbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdmVyc2lvbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi92ZXJzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyYTgxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi92ZXJzaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9qcGFfZmFjZXRfd2l6YmFuLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9qcGFfZmFjZXRfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlMTgxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC93aXpiYW4vanBhX2ZhY2V0X3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDdmNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotSlBBX1BMQVRGT1JNPSJKUEEgUGxhdGZvcm0gVUkiCi0KLQotanBhV2l6YXJkQ2F0ZWdvcnlOYW1lID0gSlBBCi1uZXdKcGFQcm9qZWN0V2l6YXJkTmFtZSA9IEpQQSBQcm9qZWN0Ci1uZXdKcGFQcm9qZWN0V2l6YXJkRGVzYyA9IENyZWF0ZSBhIEpQQSBwcm9qZWN0Ci0KLWpwYU1lbnVOYW1lID0gSlBBIFRvb2xzCi1nZW5lcmF0ZUVudGl0aWVzID0gR2VuZXJhdGUgRW50aXRpZXMuLi4KLWdlbmVyYXRlRERMID0gR2VuZXJhdGUgRERMLi4uCi1zeW5jaHJvbml6ZUNsYXNzZXMgPSBTeW5jaHJvbml6ZSBDbGFzc2VzCi1hZGRQZXJzaXN0ZW50Q2xhc3MgPSBBZGQgcGVyc2lzdGVudCBjbGFzcyAuLi4KLXJlbW92ZVBlcnNpc3RlbnRDbGFzcyA9IFJlbW92ZSBwZXJzaXN0ZW50IGNsYXNzCi1hZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWwgPSBBZGQgcGVyc2lzdGVudCBhdHRyaWJ1dGUgdG8gWE1MCi1hZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXAgPSBBZGQgcGVyc2lzdGVudCBhdHRyaWJ1dGUgdG8gWE1MIC4uLgotcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWwgPSBSZW1vdmUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgZnJvbSBYTUwKLQotanBhUHJlZmVyZW5jZVBhZ2UgPSBKUEEKLQotanBhUHJvamVjdFByb3BlcnRpZXNQYWdlID0gSlBBCi0KLWpwYVBlcnNwZWN0aXZlID0gSlBBIERldmVsb3BtZW50Ci1qcGFEZXRhaWxzID0gSlBBIERldGFpbHMKLWpwYVN0cnVjdHVyZSA9IEpQQSBTdHJ1Y3R1cmUKLQotSnBhUHJvcG9zYWxDYXRlZ29yeSA9IEpQQSBQcm9wb3NhbHMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTYxZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YjhhZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX3RpdGxlPUFkZCBQZXJzaXN0ZW50IEF0dHJpYnV0ZQotQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19hdHRyaWJ1dGVMYWJlbD1BdHRyaWJ1dGU6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX21hcHBpbmdMYWJlbD1NYXAgYXM6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUKLQotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlPUFkZCBQZXJzaXN0ZW50IENsYXNzCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NMYWJlbD1DbGFzczoKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ190aXRsZT1QZXJzaXN0ZW50IENsYXNzIFNlbGVjdGlvbgotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX21lc3NhZ2U9Q2hvb3NlIGEgY2xhc3M6Ci1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsPU1hcCBhczoKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub0NsYXNzRXJyb3I9WW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nPUZpbGUgYWxyZWFkeSBjb250YWlucyB0aGF0IHBlcnNpc3RlbnQgY2xhc3MKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc05vdEZvdW5kV2FybmluZz1DYW5ub3QgcmVzb2x2ZSBjbGFzcwotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vTWFwcGluZ0tleUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUKLQotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlPURhdGFiYXNlIFNldHRpbmdzCi1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfZGF0YWJhc2VDb25uZWN0aW9uPURhdGFiYXNlIENvbm5lY3Rpb24KLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RUb0RhdGFiYXNlPVJlY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfY29ubmVjdGlvbj1Db25uZWN0aW9uOgotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYT1TY2hlbWE6Ci1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hSW5mbz0oTm90ZTogIE11c3QgaGF2ZSBhY3RpdmUgY29ubmVjdGlvbiB0byBzZWxlY3Qgc2NoZW1hKQotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25MaW5rPTxhPkFkZCBjb25uZWN0aW9ucy4uLjwvYT4KLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RMaW5rPTxhPlJlY29ubmVjdC4uLjwvYT4KLQotR2VuZXJhbF9icm93c2U9QnJvd3NlLi4uCi1HZW5lcmFsX2Rlc2VsZWN0QWxsPURlc2VsZWN0IEFsbAotR2VuZXJhbF9zZWxlY3RBbGw9U2VsZWN0IEFsbAotCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXM9R2VuZXJhdGUgRW50aXRpZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2Nob29zZUVudGl0eVRhYmxlPUNob29zZSB0YWJsZXMgdG8gZ2VuZXJhdGUgZW50aXRpZXMgZnJvbS4KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2dlbmVyYXRlRW50aXRpZXM9R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3N5bmNocm9uaXplQ2xhc3Nlcz1TeW5jaHJvbml6ZSBDbGFzc2VzIGluIHBlcnNpc3RlbmNlLnhtbAotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfdGFibGVzPVRhYmxlczoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlQ29sdW1uPVRhYmxlCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9lbnRpdHlOYW1lQ29sdW1uPUVudGl0eSBOYW1lCi0KLUdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUaXRsZT1EREwgR2VuZXJhdGlvbgotR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRleHQ9RERMIEdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgR2VuZXJpYyBQbGF0Zm9ybS4KLQotSnBhUHJlZmVyZW5jZVBhZ2VfZGVmYXVsdEpwYUxpYj1EZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5OgotSnBhUHJlZmVyZW5jZVBhZ2VfdXNlckxpYnNMaW5rPTxhPkNvbmZpZ3VyZSB1c2VyIGxpYnJhcmllcyAuLi48L2E+Ci1KcGFQcmVmZXJlbmNlUGFnZV9pbnZhbGlkSnBhTGliPUludmFsaWQgTGlicmFyeTogIE11c3QgY29udGFpbiBqYXZheC5wZXJzaXN0ZW5jZSBjbGFzc2VzLgotCi1KcGFTdHJ1Y3R1cmVWaWV3X3ZpZXdOb3RBdmFpbGFibGU9U3RydWN0dXJlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLUpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUZXh0PUxpbmsgd2l0aCBFZGl0b3IKLUpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JEZXNjPUxpbmsgd2l0aCBBY3RpdmUgRWRpdG9yCi1KcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVG9vbHRpcD1MaW5rIHdpdGggRWRpdG9yCi0KLUpwYURldGFpbHNWaWV3X3ZpZXdOb3RBdmFpbGFibGU9RGV0YWlscyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCi1OZXdKcGFQcm9qZWN0V2l6YXJkX3RpdGxlPU5ldyBKUEEgUHJvamVjdAotTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU9SlBBIFByb2plY3QKLU5ld0pwYVByb2plY3RXaXphcmRfZmlyc3RQYWdlX2Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSBKUEEgcHJvamVjdCBzZXR0aW5ncy4KLQotSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlPUpQQSBGYWNldAotSnBhRmFjZXRXaXphcmRQYWdlX2Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSBKUEEgc2V0dGluZ3MuCi1KcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbD1QbGF0Zm9ybQotSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbD1Db25uZWN0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbms9PGE+QWRkIGNvbm5lY3Rpb24gLi4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX2pwYUltcGxlbWVudGF0aW9uTGFiZWw9SlBBIGltcGxlbWVudGF0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfdXNlclNlcnZlckxpYkxhYmVsPVVzZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBzZXJ2ZXIgcnVudGltZQotSnBhRmFjZXRXaXphcmRQYWdlX3NwZWNpZnlMaWJMYWJlbD1Vc2UgaW1wbGVtZW50YXRpb24gbGlicmFyeToKLUpwYUZhY2V0V2l6YXJkUGFnZV9qcGFQcmVmc0xpbms9PGE+Q29uZmlndXJlIGRlZmF1bHQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgLi4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJMaWJzTGluaz08YT5Db25maWd1cmUgdXNlciBsaWJyYXJpZXMgLi4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbD1QZXJzaXN0ZW50IGNsYXNzIG1hbmFnZW1lbnQKLUpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b249RGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseQotSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uPUFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbAotSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbj1DcmVhdGUgb3JtLnhtbAotCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9tYXBBcz1NYXAgQXM6Ci0KLVBlcnNpc3RlbnRUeXBlUGFnZV9tYXBBcz1NYXAgQXM6Ci0KLU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190aXRsZT1PdmVyd3JpdGUgRXhpc3RpbmcgQ2xhc3MKLU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190ZXh0PU92ZXJ3cml0ZSBzb3VyY2UgY29kZSBmb3IgdGhlIGNsYXNzICcnezB9Jyc/Ci0KLUVudGl0aWVzR2VuZXJhdG9yX2pvYk5hbWU9R2VuZXJhdGluZyBFbnRpdGllcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfbWFwcGluZ3MucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfbWFwcGluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkNjNhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX21hcHBpbmdzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSMgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKLQotUGVyc2lzdGVudFR5cGVQYWdlX0VudGl0eUxhYmVsPUVudGl0eQotUGVyc2lzdGVudFR5cGVQYWdlX0VtYmVkZGFibGVMYWJlbD1FbWJlZGRhYmxlCi1QZXJzaXN0ZW50VHlwZVBhZ2VfTWFwcGVkU3VwZXJjbGFzc0xhYmVsPU1hcHBlZCBTdXBlcmNsYXNzCi0KLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0Jhc2ljTGFiZWw9QmFzaWMKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0lkTGFiZWw9SWQKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvTWFueUxhYmVsPU9uZSB0byBNYW55Ci1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9NYW55VG9PbmVMYWJlbD1NYW55IHRvIE9uZQotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvTWFueUxhYmVsPU1hbnkgdG8gTWFueQotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVHJhbnNpZW50TGFiZWw9VHJhbnNpZW50Ci1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9WZXJzaW9uTGFiZWw9VmVyc2lvbgotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRMYWJlbD1FbWJlZGRlZAotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRJZExhYmVsPUVtYmVkZGVkIElkCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9PbmVUb09uZUxhYmVsPU9uZSB0byBPbmUKLQotRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1FbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdCAoKQotRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlPUluaGVyaXRhbmNlCi0KLUVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLUVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0RW1wdHk9RGVmYXVsdCAoKQotRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZT1OYW1lOgotCi1CYXNpY0dlbmVyYWxTZWN0aW9uX25hbWU9TmFtZToKLUJhc2ljR2VuZXJhbFNlY3Rpb25fbmFtZURlZmF1bHQ9RGVmYXVsdCAoezB9KQotQmFzaWNHZW5lcmFsU2VjdGlvbl9mZXRjaExhYmVsPUZldGNoOgotQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsPU9wdGlvbmFsOgotQmFzaWNHZW5lcmFsU2VjdGlvbl9sb2JMYWJlbD1Mb2IKLUJhc2ljR2VuZXJhbFNlY3Rpb25fdGVtcG9yYWxMYWJlbD1UZW1wb3JhbDoKLUJhc2ljR2VuZXJhbFNlY3Rpb25fZW51bWVyYXRlZExhYmVsPUVudW1lcmF0ZWQ6Ci0KLVRhYmxlQ2hvb3Nlcl9sYWJlbD1OYW1lOgotQ2F0YWxvZ0Nob29zZXJfbGFiZWw9Q2F0YWxvZzoKLVNjaGVtYUNob29zZXJfbGFiZWw9U2NoZW1hOgotVGFibGVDb21wb3NpdGVfdGFibGVTZWN0aW9uPVRhYmxlOgotVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLVRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotCi1Db2x1bW5DaG9vc2VyX2xhYmVsPU5hbWU6Ci1Db2x1bW5UYWJsZUNob29zZXJfbGFiZWw9VGFibGU6Ci0KLVRhcmdldEVudGl0eUNob29zZXJfbGFiZWw9VGFyZ2V0IEVudGl0eToKLVRhcmdldEVudGl0eUNob29zZXJfZGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLVRhcmdldEVudGl0eUNob29zZXJfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1UYXJnZXRFbnRpdHlDaG9vc2VyX2Jyb3dzZT1Ccm93c2UuLi4KLQotTm9uT3duaW5nTWFwcGluZ19tYXBwZWRCeUxhYmVsPU1hcHBlZCBCeToKLQotSm9pblRhYmxlQ29tcG9zaXRlX2FkZD1BZGQuLi4KLUpvaW5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCgpCi1Kb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1Kb2luVGFibGVDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1Kb2luVGFibGVDb21wb3NpdGVfaW52ZXJzZUpvaW5Db2x1bW49SW52ZXJzZSBKb2luIENvbHVtbnMKLQotSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQotSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9Ci1Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0PXswfSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IERlZmF1bHQgKHsxfSkKLUpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcz17MH0gLT4gezF9Ci1Kb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbj1Kb2luIENvbHVtbnMKLUpvaW5UYWJsZUNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1Kb2luVGFibGVDb21wb3NpdGVfcmVtb3ZlPVJlbW92ZQotSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIERlZmF1bHQKLUpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnM9T3ZlcnJpZGUgRGVmYXVsdAotCi1JbnZlcnNlSm9pbkNvbHVtbkRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW49RWRpdCBJbnZlcnNlIEpvaW4gQ29sdW1uCi1JbnZlcnNlSm9pbkNvbHVtbkRpYWxvZ19kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLQotSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uPUFkZCBKb2luIENvbHVtbgotSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbj1FZGl0IEpvaW4gQ29sdW1uCi1Kb2luQ29sdW1uRGlhbG9nX25hbWU9TmFtZToKLUpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWU9UmVmZXJlbmNlZCBDb2x1bW4gTmFtZToKLUpvaW5Db2x1bW5EaWFsb2dfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1Kb2luQ29sdW1uRGlhbG9nX2luc2VydGFibGU9SW5zZXJ0YWJsZToKLUpvaW5Db2x1bW5EaWFsb2dfdXBkYXRhYmxlPVVwZGF0YWJsZToKLUpvaW5Db2x1bW5EaWFsb2dfdGFibGU9VGFibGU6Ci0KLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9nZW5lcmFsPUdlbmVyYWwKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9qb2luVGFibGU9Sm9pbiBUYWJsZQotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX3RhcmdldEVudGl0eT1UYXJnZXQgRW50aXR5OgotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2Nhc2NhZGVUeXBlPUNhc2NhZGUgVHlwZToKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9mZXRjaFR5cGU9RmV0Y2ggVHlwZToKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9tYXBwZWRCeT1NYXBwZWQgQnk6Ci0KLUNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uPUNvbHVtbjoKLUNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLUNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCAoKQotQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU9SW5zZXJ0YWJsZToKLUNvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGU9VXBkYXRhYmxlOgotCi1Kb2luQ29sdW1uQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBDb2x1bW5zCi1Kb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eT1EZWZhdWx0KCkKLUpvaW5Db2x1bW5Db21wb3NpdGVfbmFtZT1OYW1lOgotSm9pbkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLUpvaW5Db2x1bW5Db21wb3NpdGVfYWRkPUFkZC4uLgotSm9pbkNvbHVtbkNvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM9ezB9IC0+IHsxfQotSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ9RGVmYXVsdCAoezB9IC0+IHsxfSkKLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IERlZmF1bHQgKHsxfSkKLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiB7MX0KLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0PXswfSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX3JlbW92ZT1SZW1vdmUKLUpvaW5Db2x1bW5Db21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnM9T3ZlcnJpZGUgRGVmYXVsdAotCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zPU92ZXJyaWRlIERlZmF1bHQKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9hZGQ9QWRkLi4uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcmVtb3ZlPVJlbW92ZQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2RlZmF1bHRFbXB0eT1EZWZhdWx0KCkKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbj1QcmltYXJ5IEtleSBKb2luIENvbHVtbnMKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcz17MH0gLT4gezF9Ci1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0PURlZmF1bHQgKHswfSAtPiB7MX0pCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IERlZmF1bHQgKHsxfSkKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IHsxfQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdD17MH0gLT4gRGVmYXVsdCAoezF9KQotCi1BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzPUF0dHJpYnV0ZSBPdmVycmlkZXMKLUF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkRGVmYXVsdD1PdmVycmlkZSBEZWZhdWx0Ci1PdmVycmlkZXNDb21wb3NpdGVfam9pbkNvbHVtbj1Kb2luIENvbHVtbnMKLUluaGVyaXRhbmNlQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdCAoezB9KQotSW5oZXJpdGFuY2VDb21wb3NpdGVfc3RyYXRlZ3k9U3RyYXRlZ3k6Ci1Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVmFsdWU9RGlzY3JpbWluYXRvciBWYWx1ZToKLUluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JWYWx1ZURlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotCi1EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2NvbHVtbj1EaXNjcmltaW5hdG9yIENvbHVtbjoKLURpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGlzY3JpbWluYXRvclR5cGU9RGlzY3JpbWluYXRvciBUeXBlOgotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCg8cHJvdmlkZXItc3BlY2lmaWM+KQotCi1JZE1hcHBpbmdDb21wb3NpdGVfcGtfZ2VuZXJhdGlvbj1QSyBHZW5lcmF0aW9uCi1JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb249UHJpbWFyeSBLZXkgR2VuZXJhdGlvbgotSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yPVRhYmxlIEdlbmVyYXRvcgotSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yPVNlcXVlbmNlIEdlbmVyYXRvcgotCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0ZWRWYWx1ZT1HZW5lcmF0ZWQgVmFsdWUKLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWU9R2VuZXJhdG9yIE5hbWU6Ci1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneT1TdHJhdGVneToKLQotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I9U2VxdWVuY2UgR2VuZXJhdG9yCi1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZToKLVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdAotCi1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZT1UYWJsZToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yPVRhYmxlIEdlbmVyYXRvcgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW49UHJpbWFyeSBLZXkgQ29sdW1uOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdmFsdWVDb2x1bW49VmFsdWUgQ29sdW1uOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW5WYWx1ZT1QcmltYXJ5IEtleSBDb2x1bW4gVmFsdWU6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLQotT3JkZXJCeUNvbXBvc2l0ZV9vcmRlckJ5R3JvdXA9T3JkZXIgQnkKLU9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUxhYmVsPU9yZGVyIEJ5OgotT3JkZXJCeUNvbXBvc2l0ZV9ub09yZGVyaW5nPU5vIE9yZGVyaW5nCi1PcmRlckJ5Q29tcG9zaXRlX3ByaW1hcnlLZXlPcmRlcmluZz1QcmltYXJ5IEtleSBPcmRlcmluZwotT3JkZXJCeUNvbXBvc2l0ZV9jdXN0b21PcmRlcmluZz1DdXN0b20gT3JkZXJpbmcKLQotU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlcz1TZWNvbmRhcnkgVGFibGVzCi1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfYWRkPUFkZC4uLgotU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQ9RWRpdC4uLgotU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3JlbW92ZT1SZW1vdmUKLQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFNlY29uZGFyeVRhYmxlPUVkaXQgU2Vjb25kYXJ5IFRhYmxlCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19uYW1lPU5hbWU6Ci1TZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nPUNhdGFsb2c6Ci1TZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWE9U2NoZW1hOgotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYT1EZWZhdWx0ICh7MH0pCi1TZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0Q2F0YWxvZz1EZWZhdWx0ICh7MH0pCi0KLUFjY2Vzc1R5cGVDb21ib19kZWZhdWx0PURlZmF1bHQKLUVudW1Db21ib1ZpZXdlcl9kZWZhdWx0PURlZmF1bHQgKHswfSkKLU1ldGFEYXRhQ29tcGxldGVDb21ib19EZWZhdWx0PURlZmF1bHQgKHswfSkKLUpvaW5Db2x1bW5EaWFsb2dfZGVmYXVsdFRydWU9RGVmYXVsdCAoezB9KQotSW5oZXJpdGFuY2VDb21wb3NpdGVfZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlPURlZmF1bHQgKHswfSkKLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdCAoezB9KQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV94bWwucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfeG1sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODFlYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV94bWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0jIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCi0KLVBlcnNpc3RlbnRUeXBlUGFnZV9qYXZhQ2xhc3NMYWJlbD1KYXZhIENsYXNzOgotUGVyc2lzdGVudFR5cGVQYWdlX01ldGFkYXRhQ29tcGxldGVMYWJlbD1NZXRhZGF0YSBDb21wbGV0ZToKLVBlcnNpc3RlbnRUeXBlUGFnZV9BY2Nlc3NMYWJlbD1BY2Nlc3M6Ci0KLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9TY2hlbWFEZWZhdWx0PURlZmF1bHQKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9DYXRhbG9nRGVmYXVsdD1EZWZhdWx0Ci0KLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX2phdmFBdHRyaWJ1dGVMYWJlbD1KYXZhIEF0dHJpYnV0ZToKLQotWE1MRW50aXR5TWFwcGluZ3NQYWdlX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3g9WE1MIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGUKLVhNTEVudGl0eU1hcHBpbmdzUGFnZV9DYXNjYWRlUGVyc2lzdENoZWNrQm94PUNhc2NhZGUgUGVyc2lzdAotWE1MRW50aXR5TWFwcGluZ3NQYWdlX1BlcnNpc3RlbmNlVW5pdFNlY3Rpb249UGVyc2lzdGVuY2UgVW5pdAotWE1MRW50aXR5TWFwcGluZ3NQYWdlX1NjaGVtYURlZmF1bHQ9RGVmYXVsdCAoezB9KQotWE1MRW50aXR5TWFwcGluZ3NQYWdlX1NjaGVtYU5vRGVmYXVsdFNwZWNpZmllZD1EZWZhdWx0Ci1YTUxFbnRpdHlNYXBwaW5nc1BhZ2VfQ2F0YWxvZ0RlZmF1bHQ9RGVmYXVsdCAoezB9KQotWE1MRW50aXR5TWFwcGluZ3NQYWdlX0NhdGFsb2dOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdAotCi1YbWxTY2hlbWFDaG9vc2VyX1NjaGVtYUNob29zZXI9U2NoZW1hOgotWG1sQ2F0YWxvZ0Nob29zZXJfQ2F0YWxvZ0Nob29zZXI9Q2F0YWxvZzoKLQotWG1sSmF2YUNsYXNzQ2hvb3Nlcl9YbWxKYXZhQ2xhc3NEaWFsb2dfdGl0bGU9Q2xhc3MgU2VsZWN0aW9uCi1YbWxKYXZhQ2xhc3NDaG9vc2VyX1htbEphdmFDbGFzc0RpYWxvZ19tZXNzYWdlPUNob29zZSBhIHR5cGU6Ci0KLVhtbFBhY2thZ2VDaG9vc2VyX1BhY2thZ2VEaWFsb2dfdGl0bGU9UGFja2FnZSBTZWxlY3Rpb24KLVhtbFBhY2thZ2VDaG9vc2VyX1BhY2thZ2VEaWFsb2dfbWVzc2FnZT1DaG9vc2UgYSBmb2xkZXI6IAotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc2NoZW1hL2pwYVBsYXRmb3JtLmV4c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc2NoZW1hL2pwYVBsYXRmb3JtLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTBkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LnVpIiBpZD0ianBhVmVuZG9yIiBuYW1lPSJKUEEgVUkgVmVuZG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImpwYVBsYXRmb3JtIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpwYVBsYXRmb3JtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBFeHRlbmQgdGhpcyBleHRlbnNpb24gcG9pbnQgYW5kIHlvdSBtdXN0IGFsc28gZXh0ZW5kIHRoZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFQbGF0Zm9ybSAKLSAgICAgICAgICAgIGV4dGVuc2lvbiBwb2ludC4gIFRoZSBpZHMgbXVzdCBtYXRjaC4gIE9uZSBqcGFQbGF0Zm9ybSB3aWxsIGJlIGNob3NlbiBwZXIgSnBhUHJvamVjdC4gIFRoZSAKLSAgICAgICAgICAgIHBvc3NpYmxlIGpwYVBsYXRmb3JtcyB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcyBhIHByb2plY3QgcHJvcGVydHkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZCBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmpwYVZlbmRvciBleHRlbnNpb24gaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYVBsYXRmb3JtVWkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0Jhc2VKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9CYXNlSnBhUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTNlNWQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0Jhc2VKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmdlbmVyaWMuRW50aXRpZXNHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5KYXZhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLnN0cnVjdHVyZS5KYXZhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5JSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzLlhtbERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLnN0cnVjdHVyZS5YbWxTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKcGFQbGF0Zm9ybVVpIGltcGxlbWVudHMgSUpwYVBsYXRmb3JtVWkKLXsKLQlwcml2YXRlIENvbGxlY3Rpb248SUpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVyczsKLQlwcml2YXRlIENvbGxlY3Rpb248SUpwYVN0cnVjdHVyZVByb3ZpZGVyPiBzdHJ1Y3R1cmVQcm92aWRlcnM7Ci0JCi0JcHJvdGVjdGVkIEJhc2VKcGFQbGF0Zm9ybVVpKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyBDb2xsZWN0aW9uPElKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKSB7Ci0JCWlmICh0aGlzLmRldGFpbHNQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5kZXRhaWxzUHJvdmlkZXJzID0gdGhpcy5idWlsZEpwYURldGFpbHNQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRldGFpbHNQcm92aWRlcnM7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJSnBhRGV0YWlsc1Byb3ZpZGVyPiBidWlsZEpwYURldGFpbHNQcm92aWRlcigpIHsKLQkJQ29sbGVjdGlvbjxJSnBhRGV0YWlsc1Byb3ZpZGVyPiBkZXRhaWxzUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJSnBhRGV0YWlsc1Byb3ZpZGVyPigpOwotCQlkZXRhaWxzUHJvdmlkZXJzLmFkZChuZXcgSmF2YURldGFpbHNQcm92aWRlcigpKTsKLQkJZGV0YWlsc1Byb3ZpZGVycy5hZGQobmV3IFhtbERldGFpbHNQcm92aWRlcigpKTsKLQkJcmV0dXJuIGRldGFpbHNQcm92aWRlcnM7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPElKcGFTdHJ1Y3R1cmVQcm92aWRlcj4gc3RydWN0dXJlUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5zdHJ1Y3R1cmVQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5zdHJ1Y3R1cmVQcm92aWRlcnMgPSB0aGlzLmJ1aWxkSnBhU3RydWN0dXJlUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zdHJ1Y3R1cmVQcm92aWRlcnM7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElKcGFTdHJ1Y3R1cmVQcm92aWRlcj4gYnVpbGRKcGFTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJQ29sbGVjdGlvbjxJSnBhU3RydWN0dXJlUHJvdmlkZXI+IHN0cnVjdHVyZVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SUpwYVN0cnVjdHVyZVByb3ZpZGVyPigpOwotCQlzdHJ1Y3R1cmVQcm92aWRlcnMuYWRkKG5ldyBKYXZhU3RydWN0dXJlUHJvdmlkZXIoKSk7Ci0JCXN0cnVjdHVyZVByb3ZpZGVycy5hZGQobmV3IFhtbFN0cnVjdHVyZVByb3ZpZGVyKCkpOwotCQlyZXR1cm4gc3RydWN0dXJlUHJvdmlkZXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRW50aXRpZXMoSUpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQkJRW50aXRpZXNHZW5lcmF0b3IuZ2VuZXJhdGUocHJvamVjdCwgc2VsZWN0aW9uKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9JSnBhSGVscENvbnRleHRJZHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0lKcGFIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZlMTI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0lKcGFIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIERhbGkgSlBBIFVJLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSnBhSGVscENvbnRleHRJZHMgewotCi0KLQkvL0NvbnRleHRJRCBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKcHRVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7ICAvLyROT04tTkxTLTEkCi0JCi0JLy9QZXJzaXN0ZW50IFR5cGUgY29tcG9zaXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9BQ0NFU1NfVFlQRSA9IFBSRUZJWCArICJlbnRpdHlfYWNjZXNzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQVRUUklCVVRFX09WRVJSSURFUyA9IFBSRUZJWCArICJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9BVFRSSUJVVEVfT1ZFUlJJREVTX0NPTFVNTiA9IFBSRUZJWCArICJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DQVRBTE9HID0gUFJFRklYICsgImVudGl0eV9jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9JTkhFUklUQU5DRV9TVFJBVEVHWSA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VTdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9UWVBFID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX1ZBTFVFID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRSA9IFBSRUZJWCArICJlbnRpdHlfbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX1BBQ0tBR0UgPSBQUkVGSVggKyAib3JtX3BhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9TQ0hFTUEgPSBQUkVGSVggKyAib3JtX3NjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX0NBVEFMT0cgPSBQUkVGSVggKyAib3JtX2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9BQ0NFU1MgPSBQUkVGSVggKyAib3JtX2FjY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX0NBU0NBREUgPSBQUkVGSVggKyAib3JtX2Nhc2NhZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9YTUwgPSBQUkVGSVggKyAib3JtX3htbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfU0NIRU1BID0gUFJFRklYICsgImVudGl0eV9zY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBQkxFID0gUFJFRklYICsgImVudGl0eV90YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vUGVyc2lzdGVudCBBdHRyaWJ1dGUgY29tcG9zaXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ0FTQ0FERV9UWVBFID0gUFJFRklYICsgIm1hcHBpbmdfY2FzY2FkZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fSU5TRVJUQUJMRSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtbkluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fVEFCTEUgPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5UYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9VUERBVEFCTEU9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtblVwZGF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VNQkVEREVEX0FUVFJJQlVURV9PVkVSUklERVMgPSBQUkVGSVggKyAibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRU1CRURERURfQVRUUklCVVRFX09WRVJSSURFU19DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRU5VTUVSQVRFRCA9IFBSRUZJWCArICJtYXBwaW5nX2VudW1lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19GRVRDSF9UWVBFID0gUFJFRklYICsgIm1hcHBpbmdfZmV0Y2hUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfR0VORVJBVEVEX1ZBTFVFX1NUUkFURUdZID0gUFJFRklYICsgIm1hcHBpbmdfZ2VuZXJhdGVkVmFsdWVTdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9HRU5FUkFUT1JfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlR2VuZXJhdG9yTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fQ09MVU1OX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19qb2luQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fUkVGRVJFTkNFRF9DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ19qb2luUmVmZXJlbmNlZENvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5UYWJsZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVKb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19MT0IgPSBQUkVGSVggKyAibWFwcGluZ19sb2IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19NQVBfQVMgPSBQUkVGSVggKyAibWFwcGluZ19tYXBBcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX01BUFBFRF9CWSA9IFBSRUZJWCArICJtYXBwaW5nX21hcHBlZEJ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1BUSU9OQUwgPSBQUkVGSVggKyAibWFwcGluZ19vcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09SREVSX0JZID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09SREVSX0JZX05PX09SREVSSU5HID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeU5vT3JkZXJpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9QUklNQVJZX0tFWV9PUkRFUklORyA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQnlQcmltYXJ5S2V5T3JkZXJpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9DVVNUT01fT1JERVJJTkcgPSBQUkVGSVggKyAibWFwcGluZ19vcmRlckJ5Q3VzdG9tT3JkZXJpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19QUklNQVJZX0tFWV9HRU5FUkFUSU9OID0gUFJFRklYICsgIm1hcHBpbmdfcHJpbWFyeUtleUdlbmVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1IgPSBQUkVGSVggKyAibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JOYW1lIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSA9IFBSRUZJWCArICJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yU2VxdWVuY2UiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU4gPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OX1ZBTFVFID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVEFCTEU9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yVGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JWYWx1ZUNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBUkdFVF9FTlRJVFkgPSBQUkVGSVggKyAibWFwcGluZ190YXJnZXRFbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19URU1QT1JBTCA9IFBSRUZJWCArICJtYXBwaW5nX3RlbXBvcmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9Qcm9qZWN0IHByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UgPSBQUkVGSVggKyAicHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX0NPTk5FQ1RJT04gPSBQUkVGSVggKyAicHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VDb25uZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9TQ0hFTUEgPSBQUkVGSVggKyAicHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JCi0JLy9EaWFsb2dzLCBXaXphcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0NSRUFURV9PUk0gPSBQUkVGSVggKyAiZGlhbG9nX2NyZWF0ZU9STSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfRURJVF9JTlZFUlNFX0pPSU5fQ09MVU5OID0gUFJFRklYICsgImRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0dFTkVSQVRFX0VOVElUSUVTID0gUFJFRklYICsgImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19TT1VSQ0UgPSBQUkVGSVggKyAiZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19QQUNLQUdFID0gUFJFRklYICsgImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3BhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0dFTkVSQVRFX0VOVElUSUVTX1RBQkxFUyA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc190YWJsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0pQQV9GQUNFVCA9IFBSRUZJWCArICJkaWFsb2dfSlBBRmFjZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0pQQV9QTEFURk9STSA9IFBSRUZJWCArICJkaWFsb2dfSlBBUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUID0gUFJFRklYICsgImRpYWxvZ19uZXdKUEFQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0NMQVNTUEFUSCA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2NsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2RhdGFiYXNlIjsgLy8kTk9OLU5MUy0xJAotIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX1BBQ0tBR0lORyA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX3BhY2thZ2luZyI7IC8vJE5PTi1OTFMtMSQKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NSRUFUSU9OX1BBR0UgPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvL090aGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfT1VUTElORSA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZU91dGxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0lKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9JSnBhUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2ZjYjE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0lKcGFQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSUpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKcGFQbGF0Zm9ybVVpCi17Ci0JQ29sbGVjdGlvbjxJSnBhU3RydWN0dXJlUHJvdmlkZXI+IHN0cnVjdHVyZVByb3ZpZGVycygpOwotCQotCUNvbGxlY3Rpb248SUpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVycygpOwotCQotCXZvaWQgZ2VuZXJhdGVEREwoSUpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKTsKLQkKLQl2b2lkIGdlbmVyYXRlRW50aXRpZXMoSUpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI5MzczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwYUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5KYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSnBhQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotcHVibGljIGNsYXNzIEpwYUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQlwdWJsaWMgSnBhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiAoY29udGV4dCBpbnN0YW5jZW9mIEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpID8KLQkJCXRoaXMuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIGNvbnRleHQpCi0JCToKLQkJCUNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzXyhjb250ZXh0KTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHNfKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjb250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAoY3UgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJSUpwYUZpbGUganBhRmlsZSA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpKTsKLQkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJSnBhQ29tcGlsYXRpb25Vbml0IGpwYUNVID0gKEpwYUNvbXBpbGF0aW9uVW5pdCkganBhRmlsZS5nZXRDb250ZW50KCk7Ci0JCUNvbXBsZXRpb25Db250ZXh0IGNjID0gY29udGV4dC5nZXRDb3JlQ29udGV4dCgpOwotCi0JCS8vIHRoZSBjb250ZXh0J3MgInRva2VuIiBpcyByZWFsbHkgYSBzb3J0IG9mICJwcmVmaXgiIC0gaXQgZG9lcyBOT1QKLQkJLy8gY29ycmVzcG9uZCB0byB0aGUgInN0YXJ0IiBhbmQgImVuZCIgd2UgZ2V0IGJlbG93Li4uIAotCQljaGFyW10gcHJlZml4ID0gY2MuZ2V0VG9rZW4oKTsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gKChwcmVmaXggPT0gbnVsbCkgPyBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkgOiBuZXcgSWdub3JlQ2FzZVByZWZpeEZpbHRlcihwcmVmaXgpKTsKLQkJLy8gdGhlIHRva2VuICJzdGFydCIgaXMgdGhlIG9mZnNldCBvZiB0aGUgdG9rZW4ncyBmaXJzdCBjaGFyYWN0ZXIKLQkJaW50IHRva2VuU3RhcnQgPSBjYy5nZXRUb2tlblN0YXJ0KCk7Ci0JCS8vIHRoZSB0b2tlbiAiZW5kIiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSB0b2tlbidzIGxhc3QgY2hhcmFjdGVyICh5dWspCi0JCWludCB0b2tlbkVuZCA9IGNjLmdldFRva2VuRW5kKCk7Ci0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInByZWZpeDogIiArIG5ldyBTdHJpbmcocHJlZml4KSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbiBzdGFydDogIiArIHRva2VuU3RhcnQpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigidG9rZW4gZW5kOiAiICsgdG9rZW5FbmQpOwotLy8JCVN0cmluZyBzb3VyY2UgPSBjdS5nZXRTb3VyY2UoKTsKLS8vCQlTdHJpbmcgdG9rZW4gPSBzb3VyY2Uuc3Vic3RyaW5nKHRva2VuU3RhcnQsIHRva2VuRW5kICsgMSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbjogPT4iICsgdG9rZW4gKyAiPD0iKTsKLS8vCQlTdHJpbmcgc25pcHBldCA9IHNvdXJjZS5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgdG9rZW5TdGFydCAtIDIwKSwgTWF0aC5taW4oc291cmNlLmxlbmd0aCgpLCB0b2tlbkVuZCArIDIxKSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJzdXJyb3VuZGluZyBzbmlwcGV0OiA9PiIgKyBzbmlwcGV0ICsgIjw9Iik7Ci0KLQkJTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBqcGFDVS5jYW5kaWRhdGVWYWx1ZXNGb3IoY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCksIGZpbHRlcik7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHMgPSBzdHJlYW0ubmV4dCgpOwotCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKHMsIHRva2VuU3RhcnQsIHRva2VuRW5kIC0gdG9rZW5TdGFydCArIDEsIHMubGVuZ3RoKCkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2Vzc2lvbkVuZGVkKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWdub3JlQ2FzZVByZWZpeEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcjxTdHJpbmc+IHsKLQkJcHJpdmF0ZSBmaW5hbCBjaGFyW10gcHJlZml4OwotCQlJZ25vcmVDYXNlUHJlZml4RmlsdGVyKGNoYXJbXSBwcmVmaXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZShzLnRvQ2hhckFycmF5KCksIHByZWZpeCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpSWNvbnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpSWNvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkZDUyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIEpwdFVpSWNvbnMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfV0laX0JBTk5FUiA9ICJmdWxsL3dpemJhbi9qcGFfZmFjZXRfd2l6YmFuIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZiYzUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaU1lc3NhZ2VzIGV4dGVuZHMgTkxTIAotewkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpIjsgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpwdFVpTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfYXR0cmlidXRlTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19tYXBwaW5nTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19ub01hcHBpbmdLZXlFcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ19tZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19tYXBwaW5nTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vQ2xhc3NFcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc05vdEZvdW5kV2FybmluZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9kYXRhYmFzZUNvbm5lY3Rpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3JlY29ubmVjdFRvRGF0YWJhc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2Nvbm5lY3Rpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hSW5mbzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfYWRkQ29ubmVjdGlvbkxpbms7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0TGluazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYWxfYnJvd3NlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYWxfZGVzZWxlY3RBbGw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhbF9zZWxlY3RBbGw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfY2hvb3NlRW50aXR5VGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9nZW5lcmF0ZUVudGl0aWVzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3N5bmNocm9uaXplQ2xhc3NlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlQ29sdW1uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2VudGl0eU5hbWVDb2x1bW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VQYWdlX2RlZmF1bHRKcGFMaWI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJlZmVyZW5jZVBhZ2VfdXNlckxpYnNMaW5rOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VQYWdlX2ludmFsaWRKcGFMaWI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhU3RydWN0dXJlVmlld192aWV3Tm90QXZhaWxhYmxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JEZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUb29sdGlwOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYURldGFpbHNWaWV3X3ZpZXdOb3RBdmFpbGFibGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKcGFQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKcGFQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV9kZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Rlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9qcGFJbXBsZW1lbnRhdGlvbkxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV91c2VyU2VydmVyTGliTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3NwZWNpZnlMaWJMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfanBhUHJlZnNMaW5rOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV91c2VyTGlic0xpbms7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY3JlYXRlT3JtWG1sQnV0dG9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX21hcEFzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9tYXBBczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzR2VuZXJhdG9yX2pvYk5hbWU7Ci0JCi0JcHJpdmF0ZSBKcHRVaU1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaVBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNjk3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSnB0VWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0JcHJpdmF0ZSBzdGF0aWMgSnB0VWlQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogVGhlIHBsdWctaW4gaWRlbnRpZmllciBvZiBKUEEgVUkgc3VwcG9ydAotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LnVpIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQudWkiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdFVpUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCQotCQotCXB1YmxpYyBKcHRVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCWlmICghIGtleS5zdGFydHNXaXRoKCJpY29ucy8iKSkgewotCQkJa2V5ID0gImljb25zLyIgKyBrZXk7Ci0JCX0KLQkJaWYgKCEga2V5LmVuZHNXaXRoKCIuZ2lmIikpIHsKLQkJCWtleSA9IGtleSArICIuZ2lmIjsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIGtleSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvUGxhdGZvcm1SZWdpc3RyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvUGxhdGZvcm1SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYxNmYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL1BsYXRmb3JtUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVJlZ2lzdHJ5IAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGxhdGZvcm1SZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBQbGF0Zm9ybVJlZ2lzdHJ5KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9JRCA9IAotCQkianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1BMQVRGT1JNID0KLQkJImpwYVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9JRCA9Ci0JCSJpZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRfQ0xBU1MgPQotCQkiY2xhc3MiOyAvLyROT04tTkxTLTEkCQotCQkKLQkvLyBrZXk6IFN0cmluZyBqcGFQbGF0Zm9ybSBpZCAgdmFsdWU6IElDb25maWd1cmF0aW9uRWxlbWVudCBjbGFzcyBkZXNjcmlwdG9yCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGpwYVBsYXRmb3JtczsKLQkKLQkKLQkvKiAobm9uIEphdmEgZG9jKQotCSAqIHJlc3RyaWN0IGFjY2VzcwotCSAqLwotCXByaXZhdGUgUGxhdGZvcm1SZWdpc3RyeSgpIHsKLQkJYnVpbGRKcGFQbGF0Zm9ybXMoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSnBhUGxhdGZvcm1zKCkgewotCQl0aGlzLmpwYVBsYXRmb3JtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotCQkKLQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSBhbGxDb25maWdFbGVtZW50cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWJ1aWxkSnBhUGxhdGZvcm0oKElDb25maWd1cmF0aW9uRWxlbWVudCkgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSnBhUGxhdGZvcm0oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJaWYgKCEgY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMX1BMQVRGT1JNKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0lEKTsKLQkJU3RyaW5nIHBsYXRmb3JtQ2xhc3MgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9DTEFTUyk7Ci0JCQotCQlpZiAoKHBsYXRmb3JtSWQgPT0gbnVsbCkgfHwgKHBsYXRmb3JtQ2xhc3MgPT0gbnVsbCkpIHsKLQkJCWlmIChwbGF0Zm9ybUlkID09IG51bGwpIHsKLQkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0lEKTsKLQkJCX0KLQkJCWlmIChwbGF0Zm9ybUNsYXNzID09IG51bGwpIHsKLQkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0NMQVNTKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGpwYVBsYXRmb3Jtcy5jb250YWluc0tleShwbGF0Zm9ybUlkKSkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IG90aGVyQ29uZmlnRWxlbWVudCA9IGpwYVBsYXRmb3Jtcy5nZXQocGxhdGZvcm1JZCk7Ci0JCQlyZXBvcnREdXBsaWNhdGVQbGF0Zm9ybShjb25maWdFbGVtZW50LCBvdGhlckNvbmZpZ0VsZW1lbnQpOwotCQl9Ci0JCQotCQlqcGFQbGF0Zm9ybXMucHV0KHBsYXRmb3JtSWQsIGNvbmZpZ0VsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgSUpwYVBsYXRmb3JtVWkgZ2V0SnBhUGxhdGZvcm0oU3RyaW5nIHZlbmRvcklkKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCByZWdpc3RlcmVkQ29uZmlnRWxlbWVudCA9IHRoaXMuanBhUGxhdGZvcm1zLmdldCh2ZW5kb3JJZCk7Ci0JCQotCQlpZiAocmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKElKcGFQbGF0Zm9ybVVpKSByZWdpc3RlcmVkQ29uZmlnRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUX0NMQVNTKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmVwb3J0RmFpbGVkSW5zdGFudGlhdGlvbihyZWdpc3RlcmVkQ29uZmlnRWxlbWVudCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEl0ZXJhdG9yIGFsbENvbmZpZ0VsZW1lbnRzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSAKLQkJCXJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX0lEKTsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yKAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihleHRlbnNpb25zKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoKChJRXh0ZW5zaW9uKSBuZXh0KS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCX0KLQkKLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAKLQkJCSJBbiBleHRlbnNpb24gZWxlbWVudCBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKLQkJCSsgIlwiIGluIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIgaXMgbWlzc2luZyBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBcIiIKLQkJCSsgYXR0cmlidXRlTmFtZQotCQkJKyAiXCIuIjsKLQkJSnB0VWlQbHVnaW4ubG9nKG1lc3NhZ2UpOwotCX0KLQkKLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgcmVwb3J0RHVwbGljYXRlUGxhdGZvcm0oCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb25lQ29uZmlnRWxlbWVudCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG90aGVyQ29uZmlnRWxlbWVudCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiVGhlIHBsdWdpbnMgXCIiCi0JCQkrIG9uZUNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiIGFuZCBcIiIKLQkJCSsgb3RoZXJDb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpCi0JCQkrICJcIiBoYXZlIHJlZ2lzdGVyZWQgYSBkdXBsaWNhdGUgYXR0cmlidXRlIFwiaWRcIiAiCi0JCQkrICJmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwianBhVmVuZG9yXCIuIjsKLQkJSnB0VWlQbHVnaW4ubG9nKG1lc3NhZ2UpOwotCX0KLQkJCi0JLy8gVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydEZhaWxlZEluc3RhbnRpYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGUgY2xhc3MgXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NMQVNTKQotCQkJKyAiXCIgZm9yIHRoZSBleHRlbnNpb24gZWxlbWVudCBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKLQkJCSsgIlwiIGluIHRoZSBwbHVnaW4gXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiLiI7Ci0JCUpwdFVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4ZWZkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFjdGlvbiBleHRlbmRzIEFjdGlvbkRlbGVnYXRlCi17CQotCQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvcjxYbWxQZXJzaXN0ZW50QXR0cmlidXRlPiBpID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpLm5leHQoKTsKLQkJCQl4bWxQZXJzaXN0ZW50QXR0cmlidXRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1YTk2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGlhbG9ncy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgY2xhc3MgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwQWN0aW9uCi0JaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUKLXsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCQotCXByaXZhdGUgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSB1bm1hcHBlZFhtbEF0dHJpYnV0ZTsKLQkKLQkKLQlwdWJsaWMgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2coc2hlbGwsIHVubWFwcGVkWG1sQXR0cmlidXRlKTsKLQkJCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl1bm1hcHBlZFhtbEF0dHJpYnV0ZSA9IChYbWxQZXJzaXN0ZW50QXR0cmlidXRlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJc2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvQWRkUGVyc2lzdGVudENsYXNzQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFBlcnNpc3RlbnRDbGFzc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2I0ZGViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvQWRkUGVyc2lzdGVudENsYXNzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nc0ludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50Q2xhc3NBY3Rpb24KLQlpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzOwotCQotCQotCXB1YmxpYyBBZGRQZXJzaXN0ZW50Q2xhc3NBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyhzaGVsbCwgZW50aXR5TWFwcGluZ3MpOwotCQkKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWVudGl0eU1hcHBpbmdzID0gKEVudGl0eU1hcHBpbmdzSW50ZXJuYWwpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlzaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZURETEFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZURETEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdhNDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVERExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlBsYXRmb3JtUmVnaXN0cnk7Ci0KLS8qKgotICogIEdlbmVyYXRlRERMQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZURETEFjdGlvbiBleHRlbmRzIFByb2plY3RBY3Rpb24gewotCQotCXB1YmxpYyBHZW5lcmF0ZURETEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElKcGFQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgU3RyaW5nIHZlbmRvcklkID0gcHJvamVjdC5nZXRQbGF0Zm9ybSgpLmdldElkKCk7Ci0JCQotICAgICAgICB0aGlzLmpwYVBsYXRmb3JtVUkodmVuZG9ySWQpLmdlbmVyYXRlRERMKHByb2plY3QsIHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVJKFN0cmluZyB2ZW5kb3JJZCkgewotICAgICAgICByZXR1cm4gUGxhdGZvcm1SZWdpc3RyeS5JTlNUQU5DRS5nZXRKcGFQbGF0Zm9ybSh2ZW5kb3JJZCk7IAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZUVudGl0aWVzQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRW50aXRpZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyNTc5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRW50aXRpZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuUGxhdGZvcm1SZWdpc3RyeTsKLQotLyoqCi0gKiAgR2VuZXJhdGVFbnRpdGllc0FjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc0FjdGlvbiBleHRlbmRzIFByb2plY3RBY3Rpb24gewotCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSUpwYVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBTdHJpbmcgdmVuZG9ySWQgPSBwcm9qZWN0LmdldFBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJCi0gICAgICAgIHRoaXMuanBhUGxhdGZvcm1VSSh2ZW5kb3JJZCkuZ2VuZXJhdGVFbnRpdGllcyhwcm9qZWN0LCB0aGlzLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgSUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VSShTdHJpbmcgdmVuZG9ySWQpIHsKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SnBhUGxhdGZvcm0odmVuZG9ySWQpOyAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9QZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjM5NmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9QZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkZpbHRlcjsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBdHRyaWJ1dGVBY3Rpb25GaWx0ZXIgCi0JaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfTUFQUEVEID0gImlzTWFwcGVkIjsKLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlKE9iamVjdCB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCEgSVNfTUFQUEVELmVxdWFscyhuYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlCb29sZWFuIGJvb2xlYW5WYWx1ZTsKLQkJaWYgKCJ0cnVlIi5lcXVhbHModmFsdWUpKSB7Ci0JCQlib29sZWFuVmFsdWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzKHZhbHVlKSkgewotCQkJYm9vbGVhblZhbHVlID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gbWFwcGVkID0gKChJUGVyc2lzdGVudEF0dHJpYnV0ZSkgdGFyZ2V0KS5tYXBwaW5nS2V5KCkgIT0gSU1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCQlyZXR1cm4gbWFwcGVkID09IGJvb2xlYW5WYWx1ZTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5Ci0JCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElBY3Rpb25GaWx0ZXIuY2xhc3MgfTsKLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApIHsKLQkJCWlmKCBhZGFwdGVyVHlwZSA9PSBJQWN0aW9uRmlsdGVyLmNsYXNzICkgewotCQkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlcigpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCSAgICAKLQkJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCQlyZXR1cm4gQURBUFRFUl9UWVBFUzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Qcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTY1N2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Qcm9qZWN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBPdmVycmlkZSBhbnkgb2YgdGhlICNleGVjdXRlKCkgbWV0aG9kcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgCi0KLQlwdWJsaWMgUHJvamVjdEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KElBY3Rpb24sIElXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJcmV0dXJuIChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jdXJyZW50U2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5leGVjdXRlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLnByb2plY3RGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZXhlY3V0ZShwcm9qZWN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0RnJvbVNlbGVjdGlvbihPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIChJUHJvamVjdCkgc2VsZWN0aW9uOwotCQl9Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCXJldHVybiAoKElKYXZhUHJvamVjdCkgc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmV4ZWN1dGUoanBhUHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY5NDllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEFjdGlvbiBleHRlbmRzIEFjdGlvbkRlbGVnYXRlCi17CQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvcjxYbWxQZXJzaXN0ZW50QXR0cmlidXRlPiBpID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpLm5leHQoKTsKLQkJCQlYbWxQZXJzaXN0ZW50VHlwZSB4bWxQZXJzaXN0ZW50VHlwZSA9ICgoWG1sVHlwZU1hcHBpbmcpIHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZU1hcHBpbmcoKSkuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCQl4bWxQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5ncygpLnJlbW92ZSh4bWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlUGVyc2lzdGVudENsYXNzQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbW92ZVBlcnNpc3RlbnRDbGFzc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhhNTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlUGVyc2lzdGVudENsYXNzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nc0ludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGNsYXNzIFJlbW92ZVBlcnNpc3RlbnRDbGFzc0FjdGlvbgotCWltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlCi17Ci0JcHJpdmF0ZSBYbWxQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50Q2xhc3M7Ci0JCi0JCi0JcHVibGljIFJlbW92ZVBlcnNpc3RlbnRDbGFzc0FjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVhtbFR5cGVNYXBwaW5nIG1hcHBpbmcgPSBwZXJzaXN0ZW50Q2xhc3MuZ2V0TWFwcGluZygpOwotCQkoKEVudGl0eU1hcHBpbmdzSW50ZXJuYWwpIG1hcHBpbmcuZ2V0RW50aXR5TWFwcGluZ3MoKSkuZ2V0VHlwZU1hcHBpbmdzKCkucmVtb3ZlKG1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlwZXJzaXN0ZW50Q2xhc3MgPSAoWG1sUGVyc2lzdGVudFR5cGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvU3luY2hyb25pemVDbGFzc2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNGRiOGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnN5bmNoLlN5bmNocm9uaXplQ2xhc3Nlc0pvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24gCi0JaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgCi17Ci0JcHJpdmF0ZSBJRmlsZSBmaWxlOwotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gbm8tb3AgZm9yIG5vdwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlTeW5jaHJvbml6ZUNsYXNzZXNKb2Igam9iID0gbmV3IFN5bmNocm9uaXplQ2xhc3Nlc0pvYihmaWxlKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gb25seSBvbmUgZWxlbWVudCBpbiBhY3R1YWwgc2VsZWN0aW9uCi0JCWZpbGUgPSAoSUZpbGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGVBY3Rpb25GaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY1N2E5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlciAKLQlleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGVBY3Rpb25GaWx0ZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19WSVJUVUFMID0gImlzVmlydHVhbCI7Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gdGVzdEF0dHJpYnV0ZShPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICghIElTX1ZJUlRVQUwuZXF1YWxzKG5hbWUpKSB7Ci0JCQlyZXR1cm4gc3VwZXIudGVzdEF0dHJpYnV0ZSh0YXJnZXQsIG5hbWUsIHZhbHVlKTsKLQkJfQotCQkKLQkJQm9vbGVhbiBib29sZWFuVmFsdWU7Ci0JCWlmICgidHJ1ZSIuZXF1YWxzKHZhbHVlKSkgewotCQkJYm9vbGVhblZhbHVlID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICgiZmFsc2UiLmVxdWFscyh2YWx1ZSkpIHsKLQkJCWJvb2xlYW5WYWx1ZSA9IGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAoKFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHRhcmdldCkuaXNWaXJ0dWFsKCkgPT0gYm9vbGVhblZhbHVlOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSUFjdGlvbkZpbHRlci5jbGFzcyB9OwotCQkKLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkgewotCQkJaWYoIGFkYXB0ZXJUeXBlID09IElBY3Rpb25GaWx0ZXIuY2xhc3MgKSB7Ci0JCQkJcmV0dXJuIG5ldyBYbWxQZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JICAgIAotCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJCXJldHVybiBBREFQVEVSX1RZUEVTOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSnBhQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKcGFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzZmY4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKcGFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKcGFDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotCWltcGxlbWVudHMgSUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQkKLQlwdWJsaWMgQmFzZUpwYUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEJhc2VKcGFDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjayxUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuTlVMTCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyLmJ1aWxkV2lkZ2V0KHBhcmVudCk7Ci0JCXRoaXMuY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotCQlpbml0aWFsaXplTGF5b3V0KHRoaXMuY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcG9zaXRlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpwYUNvbnRyb2xsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpwYUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0MDFlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKcGFDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKcGFDb250cm9sbGVyIAotewotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotCQotCXByb3RlY3RlZCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLy9wdXQgaW4gdGhlIHBvcHVsYXRpbmcgZmxhZyB0byBzdG9wIHRoZSBjaXJjdWxhciBwb3B1bGF0aW9uIG9mIHRoZSBlbnRpdHkgbmFtZSBjb21ibwotCS8vcG9wdWxhdGVFbnRpdHlOYW1lQ29tYm8gaXMgY2FsbGluZyBzZWxlY3QoKSB3aGljaCBjYXVzZXMgZW50aXR5TmFtZUNvbWJvTW9kaWZpZWQoKSB0byBiZSBjYWxsZWQKLQkvL3RoaXMgc2V0cyB0aGUgbmFtZSBpbiB0aGUgbW9kZWwgd2hpY2ggc3RhcnRzIHRoZSBjaXJjbGUgb3ZlciBhZ2Fpbi4gV2Ugc2hvdWxkIHByb2JhYmx5Ci0JLy9zaG9ydC1jaXJjdWl0IHRoaXMgZGlmZmVyZW50bHksIGxpa2UgaW4gdGhlIGVtZiBtb2RlbCwga2VlcCB0aGUgcHJvcGVydHkgY2hhbmdlIGZyb20gYmVpbmcgZmlyZWQgaWYgCi0JLy9hIGNoYW5nZSBkaWQgbm90IGFjdHVhbGx5IG9jY3VyIC0gS0ZNCi0JcHJpdmF0ZSBib29sZWFuIHBvcHVsYXRpbmc7Ci0JCi0JCi0JcHVibGljIEJhc2VKcGFDb250cm9sbGVyKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ID0gd2lkZ2V0RmFjdG9yeTsKLQkJYnVpbGRXaWRnZXQocGFyZW50KTsKLQkJdGhpcy5jb21tYW5kU3RhY2sgPSB0aGVDb21tYW5kU3RhY2s7Ci0JfQotCQotCXB1YmxpYyBCYXNlSnBhQ29udHJvbGxlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ID0gd2lkZ2V0RmFjdG9yeTsKLQkJYnVpbGRXaWRnZXQocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMuY29tbWFuZFN0YWNrID0gdGhlQ29tbWFuZFN0YWNrOwotCX0KLQkKLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB1c2luZyB0aGUgY29uc3RydWN0b3Igd2l0aG91dCB0aGUgc3R5bGUgYml0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBubyBvcAotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB1c2luZyB0aGUgY29uc3RydWN0b3Igd2l0aCB0aGUgc3R5bGUgYml0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIG91dHNpZGUgd2hlbiBzZXR0aW5nIHRoZSBvYmplY3Qgb2YgaW50ZXJlc3QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMucG9wdWxhdGluZyA9IHRydWU7Ci0JCWRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQlkb1BvcHVsYXRlKG9iaik7Ci0JCWVuZ2FnZUxpc3RlbmVycygpOwotCQl0aGlzLnBvcHVsYXRpbmcgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIChwZXJoYXBzIGludGVybmFsbHkpIHdoZW4gdGhpcyBuZWVkcyB0byByZXBvcHVsYXRlIAotCSAqIGJ1dCB0aGUgb2JqZWN0IG9mIGludGVyZXN0IGhhcyBub3QgY2hhbmdlZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHBvcHVsYXRlKCkgewotCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMucG9wdWxhdGluZyA9IHRydWU7Ci0JCWRvUG9wdWxhdGUoKTsKLQkJdGhpcy5wb3B1bGF0aW5nID0gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvUG9wdWxhdGUoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvcHVsYXRpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnBvcHVsYXRpbmc7Ci0JfQotCQotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXRGYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgZ2V0Q29udHJvbCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSnBhRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpwYURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1N2UxM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSnBhRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKcGFEZXRhaWxzUGFnZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi0JaW1wbGVtZW50cyBJSnBhRGV0YWlsc1BhZ2UgCi17Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsKLQotCXB1YmxpYyBCYXNlSnBhRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQmFzZUpwYURldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCS8vdXNpbmcgdGhpcyB0byBnZXQgYSBTY3JvbGwgYmFyIG9uIHRoZSBKcGFEZXRhaWxzVmlldwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlTY3JvbGxlZEZvcm0gc2Nyb2xsZWRGb3JtID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotCQkvL05lc3RpbmcgYW5vdGhlciBjb21wb3NpdGUgYmVjYXVzZSBjb21ib3Mgb24gdGhlIFNjcm9sbGVkRm9ybSBkaWRuJ3QgaGF2ZSBhIGJvcmRlcgotCQlzY3JvbGxlZEZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZUNvbXBvc2l0ZShzY3JvbGxlZEZvcm0uZ2V0Qm9keSgpLCBzdHlsZSk7Ci0JCXRoaXMuY29udHJvbCA9IHNjcm9sbGVkRm9ybTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBwb3B1bGF0ZShJSnBhQ29udGVudE5vZGUgY29udGVudE5vZGUpIHsKLQkJc3VwZXIucG9wdWxhdGUoY29udGVudE5vZGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCWRvUG9wdWxhdGUoKElKcGFDb250ZW50Tm9kZSkgb2JqKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9Qb3B1bGF0ZShJSnBhQ29udGVudE5vZGUgY29udGVudE5vZGUpOwotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRyb2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lKcGFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSUpwYUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA5ZmVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSUpwYUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgICAgIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLQotcHVibGljIGludGVyZmFjZSBJSnBhQ29tcG9zaXRlPEUgZXh0ZW5kcyBFT2JqZWN0PiB7Ci0KLQl2b2lkIHBvcHVsYXRlKEUgbW9kZWwpOwotCQotCUNvbnRyb2wgZ2V0Q29udHJvbCgpOwotCQotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSUpwYURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNzhkMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKcGFEZXRhaWxzUGFnZQotewotCUNvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBjb250ZW50IGZvciB0aGUgcGFnZSBhbmQgcG9wdWxhdGUgd2lkZ2V0cwotCSAqLwotCXZvaWQgcG9wdWxhdGUoSUpwYUNvbnRlbnROb2RlIGNvbnRlbnROb2RlKTsKLQkKLQkKLQkvKioKLQkgKiBQZXJmb3JtIGFueSBvdGhlciBkaXNwb3NhbCBuZWVkZWQKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSUpwYURldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjJmNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpwYURldGFpbHNQcm92aWRlciAKLXsKLQotCVN0cmluZyBmaWxlQ29udGVudFR5cGUoKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhIHByb3BlcnRpZXMgcGFnZSBnaXZlbiB0aGUgcGFyZW50IENvbXBvc2l0ZSBhbmQgdGhlCi0JICogY29udGVudCBub2RlIGlkLgotCSAqIEl0IGlzIGxlZ2FsIHRvIHNldCB0aGUgbGF5b3V0IGZvciB0aGUgZ2l2ZW4gQ29tcG9zaXRlLgotCSAqLwotCUlKcGFEZXRhaWxzUGFnZSBidWlsZERldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUsIE9iamVjdCBjb250ZW50Tm9kZUlkLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGFnZUJvb2tNYW5hZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BhZ2VCb29rTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGM1ODNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGFnZUJvb2tNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBWZXJzYW50LiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IFZlcnNhbnQuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEEgd3JhcHBlciBmb3IgYSA8Y29kZT5QYWdlQm9vazwvY29kZT4gd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgUGFnZUJvb2tNYW5hZ2VyIGV4dGVuZHMgUGFnZUJvb2sgewotCi0JcHJpdmF0ZSBNYXAgcGFnZVJlY29yZHM7Ci0JcHJpdmF0ZSBPYmplY3QgYWN0aXZlOwotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZGVmYXVsdENvbXBvc2l0ZTsKLQkKLQkvKioKLQkgKiBBIDxjb2RlPlBhZ2VCb29rTWFuYWdlcjxjb2RlPiBpcyBhIHdyYXBwZXIgZm9yIGEgPGNvZGU+UGFnZUJvb2s8L2NvZGU+LiBJdCBwcm92aWRlcwotCSAqIGNvbnZlbmllbmNlIG1ldGhvZHMgdG8gYWRkLCByZW1vdmUsIGFjdGl2YXRlIGFuZCBpbmFjdGl2ZSBwYWdlcyBpbiB0aGUgaW50ZXJuYWwgPGNvZGU+UGFnZUJvb2s8L2NvZGU+LgotCSAqIElmIGEgcGFnZSBnZXRzIGRlYWN0aXZhdGVkLCB0aGUgbWFuYWdlciBhY3RpdmF0ZXMgYSBkZWZhdWx0IHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZSB0byB0aGlzIG1hbmFnZXIKLQkgKiBAcGFyYW0gYURlZmF1bHRMYWJlbCBUaGUgbGFiZWwgb24gdGhlIHRoZSBkZWZhdWx0IHBhZ2UuCi0JICovCi0JcHVibGljIFBhZ2VCb29rTWFuYWdlcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgYURlZmF1bHRMYWJlbCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJdGhpcy5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMucGFnZVJlY29yZHMgPSBuZXcgSGFzaE1hcCgpOwotCQl0aGlzLnBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMsIFNXVC5OT05FKTsKLQkJdGhpcy5kZWZhdWx0Q29tcG9zaXRlID0gbmV3IERlZmF1bHRDb21wb3NpdGUocGFnZUJvb2ssIGFEZWZhdWx0TGFiZWwpOwotCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuT2JqIEFjdGl2YXRlcyAoZmxpcHMgdG8gdG9wIGluIHRoZSA8Y29kZT5QYWdlQm9vazwvY29kZT4pIHRoZSBhc3NvY2lhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gCi0JICogZm9yIHRoZSBnaXZlbiA8Y29kZT5PYmplY3Q8L2NvZGU+LiBBY3RpdmF0ZXMgdGhlIDxjb2RlPkRlZmF1bHRDb21wb3NpdGU8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGFzc29jaWF0aW9uCi0JICogZm9yIHRoZSBnaXZlbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotCSAqIEByZXR1cm4gUmV0dXJuIGZhbHNlIGlmIHRoZXJlIGlzIG5vIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gYXNzb2NpYXRpb24gdG8gdGhlIGdpdmVuIDxjb2RlPk9iamVjdDwvY29kZT4gb3IKLQkgKiB0aGUgYXNzb2NpYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGlzIGFscmVhZHkgYWN0aXZlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjdGl2YXRlKE9iamVjdCBhbk9iaikgewotCQlpZihhbk9iaiAhPSBudWxsICYmICFhbk9iai5lcXVhbHModGhpcy5hY3RpdmUpICYmIHRoaXMucGFnZVJlY29yZHMuY29udGFpbnNLZXkoYW5PYmopKSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgdGhpcy5wYWdlUmVjb3Jkcy5nZXQoYW5PYmopOwotCQkJdGhpcy5wYWdlQm9vay5zaG93UGFnZShjb21wb3NpdGUpOwotCQkJdGhpcy5hY3RpdmUgPSBhbk9iajsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYoKGFuT2JqID09IG51bGwgfHwgIWFuT2JqLmVxdWFscyh0aGlzLmFjdGl2ZSkpICYmICF0aGlzLnBhZ2VSZWNvcmRzLmNvbnRhaW5zS2V5KGFuT2JqKSkgewotCQkJdGhpcy5wYWdlQm9vay5zaG93UGFnZSh0aGlzLmRlZmF1bHRDb21wb3NpdGUpOwotCQkJdGhpcy5hY3RpdmUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFuT2JqCi0JICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzc29jaWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBoYXMgYmVlbiBkZWFjdGl2YXRlZC4KLQkgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gZm9yIHRoZSBnaXZlbiA8Y29kZT5PYmplY3Q8L2NvZGU+Ci0JICogb3IgdGhlIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gaXMgYWxyZWFkeSBpbmFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkZWFjdGl2YXRlKE9iamVjdCBhbk9iaikgewotCQlpZihhbk9iai5lcXVhbHModGhpcy5hY3RpdmUpKSB7Ci0JCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7Ci0JCQl0aGlzLmFjdGl2ZSA9IG51bGw7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5PYmplY3Q8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogaW4gdGhpcyA8Y29kZT5QYWdlQm9va01hbmFnZXI8L2NvZGU+LgotICAgICAqIElmIHRoaXMgbWFuYWdlciBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+LCB0aGUgb2xkCi0gICAgICogPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpcyByZXBsYWNlZCBieSB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0gICAgICogCi0JICogQHBhcmFtIGFuT2JqIDxjb2RlPk9iamVjdDwvY29kZT4gd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gaXMgdG8gYmUgYXNzb2NpYXRlZC4KLQkgKiBAcGFyYW0gYUNvbXBvc2l0ZSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPk9iamVjdDwvY29kZT4uCi0JICogCi0gICAgICogQHJldHVybiBwcmV2aW91cyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQgPGNvZGU+T2JqZWN0PC9jb2RlPiwKLSAgICAgKiAJCSAgIG9yIDx0dD5udWxsPC90dD4gaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIDxjb2RlPk9iamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBwdXQoT2JqZWN0IGFuT2JqLCBDb21wb3NpdGUgYUNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgdGhpcy5wYWdlUmVjb3Jkcy5wdXQoYW5PYmosIGFDb21wb3NpdGUpOwotCQl0aGlzLmFjdGl2YXRlKGFuT2JqKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyA8Y29kZT5PYmplY3Q8L2NvZGU+IGZyb20gdGhpcyBwYWdlYm9va21hbmFnZXIgaWYgaXQgaXMgcHJlc2VudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbk9iaiA8Y29kZT5PYmplY3Q8L2NvZGU+IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoaXMgPGNvZGU+UGFnZUJvb2tNYW5hZ2VyPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICAgICAqLwotCXB1YmxpYyBDb21wb3NpdGUgcmVtb3ZlKE9iamVjdCBhbk9iaikgewotCQlpZihhbk9iai5lcXVhbHModGhpcy5hY3RpdmUpKSB7Ci0JCQl0aGlzLmFjdGl2ZSA9IG51bGw7Ci0JCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7Ci0JCX0JCi0JCXJldHVybiAoQ29tcG9zaXRlKSB0aGlzLnBhZ2VSZWNvcmRzLnJlbW92ZShhbk9iaik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuT2JqIHdob3NlIHByZXNlbmNlIGluIHRoaXMgbWFwIGlzIHRvIGJlIHRlc3RlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIDxjb2RlPlBhZ2VCb29rTWFuYWdlcjwvY29kZT4gY29udGFpbnMgYSBtYXBwaW5nIGZvciB0aGUKLQkgKiAJCSAgIGdpdmVuIDxjb2RlPk9iamVjdDwvY29kZT4uIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgYW5PYmopIHsKLQkJcmV0dXJuIHRoaXMucGFnZVJlY29yZHMuY29udGFpbnNLZXkoYW5PYmopOwotCX0KLQkKLQlwdWJsaWMgQ29tcG9zaXRlIGdldChPYmplY3Qga2V5KSB7Ci0JCXJldHVybiAoQ29tcG9zaXRlKSBwYWdlUmVjb3Jkcy5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgYWN0aXZlIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0QWN0aXZlKCkgewotCQlpZih0aGlzLmFjdGl2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29tcG9zaXRlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIChDb21wb3NpdGUpIHRoaXMucGFnZVJlY29yZHMuZ2V0KHRoaXMuYWN0aXZlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGludGVybmFsIDxjb2RlPlBhZ2VCb29rPC9jb2RlPiBvZiB0aGlzIDxjb2RlPlBhZ2VCb29rTWFuYWdlcjwvY29kZT4uIAotCSAqIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT5zIHdoaWNoIHNob3VsZCB3b3JrIHdpdGggdGhpcyBtYW5hZ2VyIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLQkgKiB3aXRoIHRoaXMgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBhcyB0aGVpciBwYXJlbnQgY29tcG9zaXRlLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gdGhpcy5wYWdlQm9vazsKLQl9Ci0KLQkvLyBhIGRlZmF1bHQgY29tcG9zaXRlIHdoaWNoIGlzIHNob3cgaWYgdGhlIGFjdGl2ZSBjb21wb3NpdGUKLQkvLyBnZXRzIGRlYWN0aXZhdGVkCi0JcHJpdmF0ZSBjbGFzcyBEZWZhdWx0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkJcHVibGljIERlZmF1bHRDb21wb3NpdGUoQ29tcG9zaXRlIGFQYXJlbnQsIFN0cmluZyBhRGVmYXVsdExhYmVsKSB7Ci0JCQlzdXBlcihhUGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlzZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTEVGVCk7Ci0JCQlsYWJlbC5zZXRUZXh0KGFEZWZhdWx0TGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJQ29sbGVjdGlvbiBjb21wb3NpdGVzID0gdGhpcy5wYWdlUmVjb3Jkcy52YWx1ZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29tcG9zaXRlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkoKENvbXBvc2l0ZSkgaS5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJhMzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYUNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuQmFzaWNNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkRlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuSWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZSBleHRlbmRzIEJhc2VKcGFEZXRhaWxzUGFnZSAKLXsKLQlwcml2YXRlIElQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZTsKLQlwcml2YXRlIElBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmc7Ci0JcHJpdmF0ZSBBZGFwdGVyIHBlcnNpc3RlbnRBdHRyaWJ1dGVMaXN0ZW5lcjsKLQlwcml2YXRlIEFkYXB0ZXIgYXR0cmlidXRlTWFwcGluZ0xpc3RlbmVyOwotCQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRNYXBwaW5nS2V5OwotCQotCXByaXZhdGUgQ0NvbWJvVmlld2VyIG1hcHBpbmdDb21ibzsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIElKcGFDb21wb3NpdGU8SUF0dHJpYnV0ZU1hcHBpbmc+PiBtYXBwaW5nQ29tcG9zaXRlczsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgbWFwcGluZ1BhZ2VCb29rOwkKLQlwcml2YXRlIElKcGFDb21wb3NpdGU8SUF0dHJpYnV0ZU1hcHBpbmc+IGN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlOwotCQotCS8qKgotCSAqIFRoZXNlIElBdHR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzIHdpbGwgYmUgdXNlZCBhcyBlbGVtZW50cyBpbiB0aGUgYXR0cmlidXRlTWFwcGluZyBjb21ibwotCSAqIFRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBjb21ibyB3aWxsIGJlIG9uZSBvZiB0aGUgZGVmYXVsdEF0dHJpYnV0ZW1hcHBpbmdVaVByb3ZpZGVycyBvcgotCSAqIGlmIG5vbmUgb2YgdGhvc2UgYXBwbHkgdGhlIG51bGxBdHRyaXVidGVNYXBwaW5nVWlQcm92aWRlciB3aWxsIGJlIHVzZWQuIFRoZSByZXN0IG9mIHRoZSBlbGVtZW50cwotCSAqIHdpbGwgYmUgdGhlIGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycy4gIFRoZSBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgaXMKLQkgKiBkZXRlcm1pbmVkIGJ5IG1hdGNoaW5nIGl0cyBrZXkgd2l0aCB0aGUga2V5IG9mIHRoZSBjdXJyZW50IGF0dHJpdWJ0ZU1hcHBpbmcuICAKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248SUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4gZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyczsKLQlwcml2YXRlIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBudWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci0JCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUsIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpLCB3aWRnZXRGYWN0b3J5KTsKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZUxpc3RlbmVyID0gYnVpbGRBdHRyaWJ1dGVMaXN0ZW5lcigpOwotCQlhdHRyaWJ1dGVNYXBwaW5nTGlzdGVuZXIgPSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdMaXN0ZW5lcigpOwotCQltYXBwaW5nQ29tcG9zaXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUpwYUNvbXBvc2l0ZTxJQXR0cmlidXRlTWFwcGluZz4+KCk7Ci0JCXRoaXMuYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzID0gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzID0gYnVpbGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JCXRoaXMubnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyID0gYnVpbGROdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBidWlsZE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJcmV0dXJuIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlDb2xsZWN0aW9uPElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4gcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI+KCk7Ci0JCXByb3ZpZGVycy5hZGQoQmFzaWNNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChJZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwkJCQotCQlwcm92aWRlcnMuYWRkKE1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsJCQkKLQkJcHJvdmlkZXJzLmFkZChNYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsJCQkKLQkJcHJvdmlkZXJzLmFkZChPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsJCQkKLQkJcHJvdmlkZXJzLmFkZChPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKFRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKFZlcnNpb25NYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0JCi0JcHJvdGVjdGVkICBDb2xsZWN0aW9uPElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4gYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4gYnVpbGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlDb2xsZWN0aW9uPElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4gcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI+KCk7Ci0JCXByb3ZpZGVycy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7CQkKLQkJcHJvdmlkZXJzLmFkZChEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsJCQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQkKLQlwcm90ZWN0ZWQgIENvbGxlY3Rpb248SUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzOwotCX0KLQkKLQlwcml2YXRlIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihTdHJpbmcga2V5KSB7Ci0JCWZvciAoSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIHByb3ZpZGVyIDogYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkpIHsKLQkJCWlmIChwcm92aWRlci5rZXkoKSA9PSBrZXkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMubnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotCX0KLQlwcml2YXRlIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQlmb3IgKElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBwcm92aWRlciA6IGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSkgewotCQkJaWYgKHByb3ZpZGVyLmtleSgpID09IGtleSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5udWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEF0dHJpYnV0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlwZXJzaXN0ZW50QXR0cmlidXRlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQl2b2lkIHBlcnNpc3RlbnRBdHRyaWJ1dGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzKSkgewotCQkJY2FzZSBKcGFDb3JlUGFja2FnZS5JUEVSU0lTVEVOVF9BVFRSSUJVVEVfX01BUFBJTkc6Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlhdHRyaWJ1dGVNYXBwaW5nQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQl2b2lkIGF0dHJpYnV0ZU1hcHBpbmdDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLS8vCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpKSB7Ci0vLwkJCWNhc2UgSnBhQ29yZVBhY2thZ2UuSUFUVFJJQlVURV9NQVBQSU5HX19ERUZBVUxUOgotLy8JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotLy8JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJCQkJcG9wdWxhdGUoKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0pOwotLy8JCQkJYnJlYWs7Ci0vLwkJfQotCX0KLQkJCi0JcHJvdGVjdGVkIExhYmVsIGJ1aWxkTWFwcGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfbWFwQXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ0NvbWJvVmlld2VyIGJ1aWxkTWFwcGluZ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQltYXBwaW5nQ29tYm8gPSBuZXcgQ0NvbWJvVmlld2VyKGNvbWJvKTsKLQkJbWFwcGluZ0NvbWJvLnNldENvbnRlbnRQcm92aWRlcihidWlsZENvbnRlbnRQcm92aWRlcigpKTsKLQkJbWFwcGluZ0NvbWJvLnNldExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQltYXBwaW5nQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQltYXBwaW5nQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gbWFwcGluZ0NvbWJvOwotCX0KLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCWlmIChpbnB1dEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFtde307Ci0JCQkJfQotCQkJCXJldHVybiB1aVByb3ZpZGVyc0ZvcigoSVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcltdIHVpUHJvdmlkZXJzRm9yKElQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbmV3IElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlclthdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKS5zaXplKCkgKzFdOwotCQlwcm92aWRlcnNbMF0gPSAgdGhpcy5udWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci0JCWZvciAoSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIHVpUHJvdmlkZXIgOiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkpIHsKLQkJCWlmICh1aVByb3ZpZGVyLmtleSgpID09IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZGVmYXVsdE1hcHBpbmdLZXkoKSkgewotCQkJCXByb3ZpZGVyc1swXSA9IHVpUHJvdmlkZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IGkgPSAxOwotCQlmb3IgKElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciB1aVByb3ZpZGVyIDogYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkpIHsKLQkJCXByb3ZpZGVyc1tpKytdID0gdWlQcm92aWRlcjsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIpIGVsZW1lbnQpLmxhYmVsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQYWdlQm9vayBidWlsZE1hcHBpbmdQYWdlQm9vayhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW1hcHBpbmdQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJcmV0dXJuIG1hcHBpbmdQYWdlQm9vazsKLQl9Ci0JCi0JcHJvdGVjdGVkIElKcGFDb21wb3NpdGU8SUF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0NvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaywgU3RyaW5nIGtleSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVNYXBwaW5nID09IG51bGwgfHwgdGhpcy5hdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdCgpKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKGtleSkuYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKHBhZ2VCb29rLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJfQotCi0JCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihrZXkpLmJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShwYWdlQm9vaywgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCQkKLQl2b2lkIG1hcHBpbmdDaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCVN0cmluZyBrZXkgPSAodGhpcy5kZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkuY29udGFpbnMocHJvdmlkZXIpID8gbnVsbCA6IHByb3ZpZGVyLmtleSgpKTsKLQkJCWF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRNYXBwaW5nS2V5KGtleSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShJSnBhQ29udGVudE5vZGUgcGVyc2lzdGVudEF0dHJpYnV0ZU5vZGUpIHsKLQkJYXR0cmlidXRlID0gKElQZXJzaXN0ZW50QXR0cmlidXRlKSBwZXJzaXN0ZW50QXR0cmlidXRlTm9kZTsKLQkJcG9wdWxhdGVNYXBwaW5nQ29tYm9BbmRQYWdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlTWFwcGluZ0NvbWJvQW5kUGFnZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlLmVBZGFwdGVycygpLmFkZChwZXJzaXN0ZW50QXR0cmlidXRlTGlzdGVuZXIpOwotCQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCWF0dHJpYnV0ZU1hcHBpbmcuZUFkYXB0ZXJzKCkuYWRkKGF0dHJpYnV0ZU1hcHBpbmdMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCWF0dHJpYnV0ZS5lQWRhcHRlcnMoKS5yZW1vdmUocGVyc2lzdGVudEF0dHJpYnV0ZUxpc3RlbmVyKTsKLQkJCWlmIChhdHRyaWJ1dGVNYXBwaW5nICE9IG51bGwpIHsKLQkJCQlhdHRyaWJ1dGVNYXBwaW5nLmVBZGFwdGVycygpLnJlbW92ZShhdHRyaWJ1dGVNYXBwaW5nTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU1hcHBpbmdDb21ib0FuZFBhZ2UoKSB7Ci0JCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlTWFwcGluZyA9IG51bGw7Ci0JCQljdXJyZW50TWFwcGluZ0tleSA9IG51bGw7Ci0JCQltYXBwaW5nQ29tYm8uc2V0SW5wdXQobnVsbCk7Ci0JCQltYXBwaW5nQ29tYm8uc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQkJCi0JCQlpZiAoY3VycmVudE1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJCWN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCWF0dHJpYnV0ZU1hcHBpbmcgPSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlzZXRDb21ib0RhdGEoYXR0cmlidXRlLmNhbmRpZGF0ZU1hcHBpbmdLZXlzKCkpOwotCQkKLQkJcG9wdWxhdGVNYXBwaW5nUGFnZShhdHRyaWJ1dGVNYXBwaW5nID09IG51bGwgPyBudWxsIDogYXR0cmlidXRlTWFwcGluZy5nZXRLZXkoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU1hcHBpbmdQYWdlKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWlmIChjdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlpZiAobWFwcGluZ0tleSA9PSBjdXJyZW50TWFwcGluZ0tleSkgewotCQkJCWlmIChjdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLnBvcHVsYXRlKGF0dHJpYnV0ZU1hcHBpbmcpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3VycmVudE1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQkJLy8gZG9uJ3QgcmV0dXJuCi0JCQl9Ci0JCX0KLQkJCi0JCWN1cnJlbnRNYXBwaW5nS2V5ID0gbWFwcGluZ0tleTsKLQkJCi0JCUlKcGFDb21wb3NpdGU8SUF0dHJpYnV0ZU1hcHBpbmc+IGNvbXBvc2l0ZSA9IG1hcHBpbmdDb21wb3NpdGVGb3IobWFwcGluZ0tleSk7Ci0JCW1hcHBpbmdQYWdlQm9vay5zaG93UGFnZShjb21wb3NpdGUuZ2V0Q29udHJvbCgpKTsKLQkJCi0JCWN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlID0gY29tcG9zaXRlOwotCQljdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5wb3B1bGF0ZShhdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbWJvRGF0YShJdGVyYXRvcjxTdHJpbmc+IGF2YWlsYWJsZU1hcHBpbmdLZXlzKSB7Ci0JCWlmIChhdHRyaWJ1dGUgIT0gbWFwcGluZ0NvbWJvLmdldElucHV0KCkpIHsKLQkJCW1hcHBpbmdDb21iby5zZXRJbnB1dChhdHRyaWJ1dGUpOwotCQl9Ci0JCWlmIChhdHRyaWJ1dGVNYXBwaW5nID09IG51bGwgfHwgYXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHQoKSkgewotCQkJbWFwcGluZ0NvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtYXBwaW5nQ29tYm8uZ2V0RWxlbWVudEF0KDApKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgcHJvdmlkZXIgPSBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihhdHRyaWJ1dGUubWFwcGluZ0tleSgpKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsICYmICEgcHJvdmlkZXIuZXF1YWxzKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgbWFwcGluZ0NvbWJvLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSkpIHsKLQkJCQltYXBwaW5nQ29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb3ZpZGVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJSnBhQ29tcG9zaXRlPElBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nQ29tcG9zaXRlRm9yKFN0cmluZyBrZXkpIHsKLQkJSUpwYUNvbXBvc2l0ZTxJQXR0cmlidXRlTWFwcGluZz4gY29tcG9zaXRlID0gbWFwcGluZ0NvbXBvc2l0ZXMuZ2V0KGtleSk7Ci0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCQkKLQkJY29tcG9zaXRlID0gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKG1hcHBpbmdQYWdlQm9vaywga2V5KTsKLQkJCi0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJbWFwcGluZ0NvbXBvc2l0ZXMucHV0KGtleSwgY29tcG9zaXRlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCQotLy9UT0RPIGZvY3VzPz8KLS8vCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotLy8JCXN1cGVyLnNldEZvY3VzKCk7Ci0vLwkJcmV0dXJuIG1hcHBpbmdDb21iby5nZXRDb21ibygpLnNldEZvY3VzKCk7Ci0vLwl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCWZvciAoSXRlcmF0b3I8SUpwYUNvbXBvc2l0ZTxJQXR0cmlidXRlTWFwcGluZz4+IHN0cmVhbSA9IG1hcHBpbmdDb21wb3NpdGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgSVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKCkgewotCQlyZXR1cm4gYXR0cmlidXRlOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4MzUzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYUNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSVR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVtYmVkZGFibGVVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuRW50aXR5VWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSBleHRlbmRzIEJhc2VKcGFEZXRhaWxzUGFnZSAKLXsJCi0JcHJpdmF0ZSBJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU7Ci0JcHJpdmF0ZSBBZGFwdGVyIHBlcnNpc3RlbnRUeXBlTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudE1hcHBpbmdLZXk7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgdHlwZU1hcHBpbmdDb21ibzsKLQkKLQkvKioKLQkgKiBBIE1hcCBvZiBtYXBwaW5nIENvbXBvc2l0ZXMgb2YgdHlwZSBJUGVyc2lzdGVuY2VDb21wb3NpdGUgdGhhdCBpcyBrZXllZCBvbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIE1hcCBjb21wb3NpdGVzOwotCQotCXByb3RlY3RlZCBQYWdlQm9vayB0eXBlTWFwcGluZ1BhZ2VCb29rOwotCQotCXByaXZhdGUgSUpwYUNvbXBvc2l0ZSB2aXNpYmxlTWFwcGluZ0NvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248SVR5cGVNYXBwaW5nVWlQcm92aWRlcj4gdHlwZU1hcHBpbmdVaVByb3ZpZGVyczsKLQkKLQlwdWJsaWMgUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUsIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5wZXJzaXN0ZW50VHlwZUxpc3RlbmVyID0gYnVpbGRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMudHlwZU1hcHBpbmdVaVByb3ZpZGVycyA9IGJ1aWxkVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPiBidWlsZFR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCUNvbGxlY3Rpb248SVR5cGVNYXBwaW5nVWlQcm92aWRlcj4gdHlwZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SVR5cGVNYXBwaW5nVWlQcm92aWRlcj4oKTsKLQkJdHlwZU1hcHBpbmdVaVByb3ZpZGVycy5hZGQobmV3IE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIoKSk7Ci0JCXR5cGVNYXBwaW5nVWlQcm92aWRlcnMuYWRkKG5ldyBFbnRpdHlVaVByb3ZpZGVyKCkpOwotCQl0eXBlTWFwcGluZ1VpUHJvdmlkZXJzLmFkZChuZXcgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIoKSk7CQkJCi0JCXR5cGVNYXBwaW5nVWlQcm92aWRlcnMuYWRkKG5ldyBFbWJlZGRhYmxlVWlQcm92aWRlcigpKTsJCQkKLQkJcmV0dXJuIHR5cGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZFBlcnNpc3RlbnRUeXBlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlwZXJzaXN0ZW50VHlwZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBlcnNpc3RlbnRUeXBlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJUGVyc2lzdGVudFR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIEpwYUNvcmVQYWNrYWdlLklQRVJTSVNURU5UX1RZUEVfX01BUFBJTkdfS0VZOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGJ1aWxkVHlwZU1hcHBpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1lc3NhZ2VzLlBlcnNpc3RlbnRUeXBlUGFnZV9tYXBBcyk7Ci0JfQotCQotCXByb3RlY3RlZCBDQ29tYm9WaWV3ZXIgYnVpbGRUeXBlTWFwcGluZ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQl0eXBlTWFwcGluZ0NvbWJvID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXR5cGVNYXBwaW5nQ29tYm8uc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkQ29udGVudFByb3ZpZGVyKCkpOwotCQl0eXBlTWFwcGluZ0NvbWJvLnNldExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQl0eXBlTWFwcGluZ0NvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdHlwZU1hcHBpbmdDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB0eXBlTWFwcGluZ0NvbWJvOwotCX0KLQkKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKHBlcnNpc3RlbnRUeXBlID09IG51bGwpID8KLQkJCQkJCW5ldyBTdHJpbmdbXSB7fToKLQkJCQkJCVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UudGhpcy50eXBlTWFwcGluZ1VpUHJvdmlkZXJzLnRvQXJyYXkoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKAotCQkJCQlWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKElUeXBlTWFwcGluZ1VpUHJvdmlkZXIpIGVsZW1lbnQpLmxhYmVsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQYWdlQm9vayBidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewotCQl0eXBlTWFwcGluZ1BhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOwotCQlyZXR1cm4gdHlwZU1hcHBpbmdQYWdlQm9vazsKLQl9Ci0JCQotCXByaXZhdGUgSUpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCXByaXZhdGUgSVR5cGVNYXBwaW5nVWlQcm92aWRlciB0eXBlTWFwcGluZ1VpUHJvdmlkZXIoU3RyaW5nIGtleSkgewotCQlmb3IgKElUeXBlTWFwcGluZ1VpUHJvdmlkZXIgcHJvdmlkZXIgOiB0aGlzLnR5cGVNYXBwaW5nVWlQcm92aWRlcnMpIHsKLQkJCWlmIChwcm92aWRlci5rZXkoKSA9PSBrZXkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgdHlwZSBtYXBwaW5nIFVJIHByb3ZpZGVyIGtleTogIiArIGtleSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0eXBlTWFwcGluZ0NoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlUeXBlTWFwcGluZ1VpUHJvdmlkZXIgcHJvdmlkZXIgPSAoSVR5cGVNYXBwaW5nVWlQcm92aWRlcikgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlwZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KHByb3ZpZGVyLmtleSgpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKElKcGFDb250ZW50Tm9kZSBwZXJzaXN0ZW50VHlwZU5vZGUpIHsKLQkJcGVyc2lzdGVudFR5cGUgPSAoSVBlcnNpc3RlbnRUeXBlKSBwZXJzaXN0ZW50VHlwZU5vZGU7Ci0JCXBvcHVsYXRlTWFwcGluZ0NvbWJvQW5kUGFnZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZU1hcHBpbmdDb21ib0FuZFBhZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJcGVyc2lzdGVudFR5cGUuZUFkYXB0ZXJzKCkuYWRkKHBlcnNpc3RlbnRUeXBlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXBlcnNpc3RlbnRUeXBlLmVBZGFwdGVycygpLnJlbW92ZShwZXJzaXN0ZW50VHlwZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNYXBwaW5nQ29tYm9BbmRQYWdlKCkgewotCQlpZiAocGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJY3VycmVudE1hcHBpbmdLZXkgPSBudWxsOwotCQkJdHlwZU1hcHBpbmdDb21iby5zZXRJbnB1dChudWxsKTsKLQkJCXR5cGVNYXBwaW5nQ29tYm8uc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQkJCi0JCQlpZiAodmlzaWJsZU1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJCXZpc2libGVNYXBwaW5nQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJCXZpc2libGVNYXBwaW5nQ29tcG9zaXRlID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgbWFwcGluZ0tleSA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRLZXkoKTsKLQkJc2V0Q29tYm9EYXRhKG1hcHBpbmdLZXksIHBlcnNpc3RlbnRUeXBlLmNhbmRpZGF0ZU1hcHBpbmdLZXlzKCkpOwotCQkKLQkJcG9wdWxhdGVNYXBwaW5nUGFnZShtYXBwaW5nS2V5KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTWFwcGluZ1BhZ2UoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJaWYgKHZpc2libGVNYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCWlmIChtYXBwaW5nS2V5ICA9PSBjdXJyZW50TWFwcGluZ0tleSkgewotCQkJCWlmICh2aXNpYmxlTWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkJCXZpc2libGVNYXBwaW5nQ29tcG9zaXRlLnBvcHVsYXRlKHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aXNpYmxlTWFwcGluZ0NvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCQkvLyBkb24ndCByZXR1cm4KLQkJCX0KLQkJfQotCQkKLQkJY3VycmVudE1hcHBpbmdLZXkgPSBtYXBwaW5nS2V5OwotCQkKLQkJSUpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlID0gbWFwcGluZ0NvbXBvc2l0ZUZvcihtYXBwaW5nS2V5KTsKLQkJdHlwZU1hcHBpbmdQYWdlQm9vay5zaG93UGFnZShtYXBwaW5nQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQotCQl2aXNpYmxlTWFwcGluZ0NvbXBvc2l0ZSA9IG1hcHBpbmdDb21wb3NpdGU7Ci0JCXZpc2libGVNYXBwaW5nQ29tcG9zaXRlLnBvcHVsYXRlKHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDb21ib0RhdGEoU3RyaW5nIG1hcHBpbmdLZXksIEl0ZXJhdG9yIGF2YWlsYWJsZU1hcHBpbmdLZXlzKSB7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSAhPSB0eXBlTWFwcGluZ0NvbWJvLmdldElucHV0KCkpIHsKLQkJCXR5cGVNYXBwaW5nQ29tYm8uc2V0SW5wdXQocGVyc2lzdGVudFR5cGUpOwotCQl9Ci0JCQotCQlJVHlwZU1hcHBpbmdVaVByb3ZpZGVyIHByb3ZpZGVyID0gdHlwZU1hcHBpbmdVaVByb3ZpZGVyKG1hcHBpbmdLZXkpOwotCQlpZiAoISBwcm92aWRlci5lcXVhbHMoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0eXBlTWFwcGluZ0NvbWJvLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSkpIHsKLQkJCXR5cGVNYXBwaW5nQ29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb3ZpZGVyKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGVGb3IoU3RyaW5nIGtleSkgewotCQlJSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUgPSAoSUpwYUNvbXBvc2l0ZSkgY29tcG9zaXRlcy5nZXQoa2V5KTsKLQkJaWYgKG1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hcHBpbmdDb21wb3NpdGU7Ci0JCX0KLQkJCi0JCW1hcHBpbmdDb21wb3NpdGUgPSBidWlsZE1hcHBpbmdDb21wb3NpdGUodHlwZU1hcHBpbmdQYWdlQm9vaywga2V5KTsKLQkJCi0JCWlmIChtYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCWNvbXBvc2l0ZXMucHV0KGtleSwgbWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBtYXBwaW5nQ29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUpwYUNvbXBvc2l0ZSBidWlsZE1hcHBpbmdDb21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2ssIFN0cmluZyBrZXkpICB7Ci0JCS8vVE9ETyB3aGF0IGFib3V0IG51bGwgY29tcG9zaXRlPwotCQlyZXR1cm4gdHlwZU1hcHBpbmdVaVByb3ZpZGVyKGtleSkuYnVpbGRQZXJzaXN0ZW50VHlwZU1hcHBpbmdDb21wb3NpdGUocGFnZUJvb2ssIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotLy8JCXJldHVybiBuZXcgTnVsbENvbXBvc2l0ZShwYWdlQm9vaywgY29tbWFuZFN0YWNrKTsKLQl9Ci0KLS8vVE9ETyBmb2N1cz8/Ci0vLwlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLS8vCQlzdXBlci5zZXRGb2N1cygpOwotLy8JCXJldHVybiB0eXBlTWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2V0Rm9jdXMoKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29tcG9zaXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkoKElKcGFDb21wb3NpdGUpIGkubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgSVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gcGVyc2lzdGVudFR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNzU1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkJhc2ljTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuSWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nCi17Ci0JcHJpdmF0ZSBYbWxQZXJzaXN0ZW50QXR0cmlidXRlIHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkKLQlwcml2YXRlIExhYmVsIGF0dHJpYnV0ZUxhYmVsOwotCQkKLQlwcml2YXRlIFRleHQgYXR0cmlidXRlVGV4dDsKLQkKLQlwcml2YXRlIExhYmVsIG1hcHBpbmdMYWJlbDsKLQkKLQlwcml2YXRlIENvbWJvVmlld2VyIG1hcHBpbmdDb21ibzsKLQkJCi0JCi0JcHVibGljIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSB1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX3RpdGxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX2F0dHJpYnV0ZUxhYmVsKTsKLQkJCQotCQlhdHRyaWJ1dGVUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUsIDEpOwotLy8JCWF0dHJpYnV0ZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoCi0vLwkJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0vLwkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0vLwkJCQkJCXZhbGlkYXRlKCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkpOwotCQlhdHRyaWJ1dGVUZXh0LnNldFRleHQodW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkKLQkJbWFwcGluZ0xhYmVsID0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAxLCBKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19tYXBwaW5nTGFiZWwpOwotCQkKLQkJbWFwcGluZ0NvbWJvID0gbmV3IENvbWJvVmlld2VyKGNyZWF0ZUNvbWJvKGNvbXBvc2l0ZSwgMSkpOwotCQltYXBwaW5nQ29tYm8uc2V0Q29udGVudFByb3ZpZGVyKAotCQkJbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQkJCQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBuZXcgT2JqZWN0W10gewotCQkJCQkJQmFzaWNNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJSWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCU1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpCi0JCQkJCX07Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCX0pOwotCQltYXBwaW5nQ29tYm8uc2V0TGFiZWxQcm92aWRlcigKLQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIpIGVsZW1lbnQpLmxhYmVsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCW1hcHBpbmdDb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQltYXBwaW5nQ29tYm8uc2V0SW5wdXQoIkZPTyIpOwotCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZWxlY3QoMCk7ICAvLyBzZWxlY3QgQmFzaWMgdG8gYmVnaW4KLQkJCi0JCS8vIFRPRE8gLSBGMSBIZWxwCi0JCS8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIElEYWxpSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQotCQkvL2dldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsgIC8vIGRpc2FibGVkIHRvIHN0YXJ0Ci0JCWFwcGx5RGlhbG9nRm9udChkaWFsb2dBcmVhKTsJCQotCQkKLQkJdmFsaWRhdGUoKTsKLQkJCi0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlnZC53aWR0aEhpbnQgPSAyNTA7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcml2YXRlIElKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVUZXh0LmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgPyBudWxsIDogKChJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkua2V5KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLS8vCQlpZiAoZW50aXR5TWFwcGluZ3MuY29udGFpbnNQZXJzaXN0ZW50VHlwZSh0eXBlKSkgewotLy8JCQl1cGRhdGVTdGF0dXMoCi0vLwkJCQluZXcgU3RhdHVzKAotLy8JCQkJCUlTdGF0dXMuV0FSTklORywgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAKLS8vCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19kdXBsaWNhdGVDbGFzc1dhcm5pbmcpKTsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQkKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7Ci0JCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19ub01hcHBpbmdLZXlFcnJvcikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl1cGRhdGVTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJdW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoZ2V0TWFwcGluZ0tleSgpKTsKLQkJdW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLnNldFZpcnR1YWwoZmFsc2UpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkOTU1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uRW50aXR5TWFwcGluZ3NJbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuRW1iZWRkYWJsZVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbnRpdHlVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZwotewotCXByaXZhdGUgRW50aXR5TWFwcGluZ3NJbnRlcm5hbCBlbnRpdHlNYXBwaW5nczsKLQkKLQlwcml2YXRlIExhYmVsIGNsYXNzTGFiZWw7Ci0JCQotCXByaXZhdGUgVGV4dCBjbGFzc1RleHQ7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY2xhc3NCcm93c2VCdXR0b247Ci0JCi0JcHJpdmF0ZSBMYWJlbCBtYXBwaW5nTGFiZWw7Ci0JCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBtYXBwaW5nQ29tYm87Ci0JCQotCQotCXB1YmxpYyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIEVudGl0eU1hcHBpbmdzSW50ZXJuYWwgZW50aXR5TWFwcGluZ3MpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gZW50aXR5TWFwcGluZ3M7Ci0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCi0JCWNsYXNzTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsIDIsIEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTGFiZWwpOwotCQkJCi0JCWNsYXNzVGV4dCA9IGNyZWF0ZVRleHQoY29tcG9zaXRlLCAxKTsKLQkJY2xhc3NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCQl2YWxpZGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJCi0JCWNsYXNzQnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgMSwgSnB0VWlNZXNzYWdlcy5HZW5lcmFsX2Jyb3dzZSk7Ci0JCWNsYXNzQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJY2xhc3NUZXh0LnNldFRleHQodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQltYXBwaW5nTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsIDIsIEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX21hcHBpbmdMYWJlbCk7Ci0JCQotCQltYXBwaW5nQ29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIoY3JlYXRlQ29tYm8oY29tcG9zaXRlLCAyKSk7Ci0JCW1hcHBpbmdDb21iby5zZXRDb250ZW50UHJvdmlkZXIoCi0JCQluZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkJCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQluZXcgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIoKSwgCi0JCQkJCQluZXcgRW50aXR5VWlQcm92aWRlcigpLCAKLQkJCQkJCW5ldyBFbWJlZGRhYmxlVWlQcm92aWRlcigpCi0JCQkJCX07Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCX0pOwotCQltYXBwaW5nQ29tYm8uc2V0TGFiZWxQcm92aWRlcigKLQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChJVHlwZU1hcHBpbmdVaVByb3ZpZGVyKSBlbGVtZW50KS5sYWJlbCgpOwotCQkJCX0KLQkJCX0pOwotCQltYXBwaW5nQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJbWFwcGluZ0NvbWJvLnNldElucHV0KCJGT08iKTsKLQkJbWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2VsZWN0KDEpOyAgLy8gc2VsZWN0IEVudGl0eSB0byBiZWdpbgotCQkKLQkJLy8gVE9ETyAtIEYxIEhlbHAKLQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSURhbGlIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0RBVEFCQVNFKTsKLQkJCi0JCS8vZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOyAgLy8gZGlzYWJsZWQgdG8gc3RhcnQKLQkJYXBwbHlEaWFsb2dGb250KGRpYWxvZ0FyZWEpOwkJCi0JCQotCQl2YWxpZGF0ZSgpOwotCQkKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWdkLndpZHRoSGludCA9IDI1MDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JcHJpdmF0ZSBJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gZW50aXR5TWFwcGluZ3MuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGNsYXNzVGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgbWFwcGluZ0NvbWJvLmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gKHNlbGVjdGlvbi5pc0VtcHR5KCkpID8gbnVsbCA6ICgoSVR5cGVNYXBwaW5nVWlQcm92aWRlcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5rZXkoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUeXBlIGNob29zZVR5cGUoKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10geyBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKSB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCi0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IAotCQkJCUphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCQkJZ2V0U2hlbGwoKSwgc2VydmljZSwgc2NvcGUsIAotCQkJCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsIAotCQkJCQkJZmFsc2UsIGdldENsYXNzTmFtZSgpKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfdGl0bGUpOyAKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX21lc3NhZ2UpOyAKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoKTsKLQkJCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGNsYXNzTmFtZSkpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub0NsYXNzRXJyb3IpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVR5cGUgdHlwZTsKLQkJdHJ5IHsKLQkJCXR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShjbGFzc05hbWUpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQl0eXBlID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuV0FSTklORywgSnB0VWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc05vdEZvdW5kV2FybmluZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoZW50aXR5TWFwcGluZ3MuY29udGFpbnNQZXJzaXN0ZW50VHlwZSh0eXBlKSkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuV0FSTklORywgSnB0VWlQbHVnaW4uUExVR0lOX0lELCAKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyBtYXBwaW5nS2V5ID0gZ2V0TWFwcGluZ0tleSgpOwotCQlpZiAobWFwcGluZ0tleSA9PSBudWxsKSB7Ci0JCQl1cGRhdGVTdGF0dXMoCi0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0VWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub01hcHBpbmdLZXlFcnJvcikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl1cGRhdGVTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJZW50aXR5TWFwcGluZ3MuYWRkTWFwcGluZyhnZXRDbGFzc05hbWUoKSwgZ2V0TWFwcGluZ0tleSgpKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZ2VuZXJpYy9FbnRpdGllc0dlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZ2VuZXJpYy9FbnRpdGllc0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDA4NjFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2dlbmVyaWMvRW50aXRpZXNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmdlbmVyaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5zeW5jaC5TeW5jaHJvbml6ZUNsYXNzZXNKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5FbnRpdHlHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5QYWNrYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzLkdlbmVyYXRlRW50aXRpZXNXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogIEVudGl0aWVzR2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdGllc0dlbmVyYXRvcgotewotCXByaXZhdGUgSUpwYVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXN0YXRpYyBwdWJsaWMgdm9pZCBnZW5lcmF0ZSggSUpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IEVudGl0aWVzR2VuZXJhdG9yKCBwcm9qZWN0LCBzZWxlY3Rpb24pLmdlbmVyYXRlKCk7Ci0JfQotCQotCXB1YmxpYyBFbnRpdGllc0dlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0aWVzR2VuZXJhdG9yKCBJSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZSgpIHsKLQkJR2VuZXJhdGVFbnRpdGllc1dpemFyZCB3aXphcmQgPSBuZXcgR2VuZXJhdGVFbnRpdGllc1dpemFyZCh0aGlzLnByb2plY3QsIHRoaXMuc2VsZWN0aW9uKTsKLQkJCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLQkJCVdvcmtzcGFjZUpvYiBydW5uYWJsZSA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzUnVubmFibGUoCi0JCQkJCXdpemFyZC5nZXRQYWNrYWdlR2VuZXJhdG9yQ29uZmlnKCksCi0JCQkJCXdpemFyZC5nZXRFbnRpdHlHZW5lcmF0b3JDb25maWcoKSwKLQkJCQkJd2l6YXJkLmdldFNlbGVjdGVkVGFibGVzKCksCi0JCQkJCXdpemFyZC5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCksCi0JCQkJCXByb2plY3QsCi0JCQkJCW5ldyBPdmVyd3JpdGVDb25maXJtZXIodGhpcy5nZXRDdXJyZW50U2hlbGwoKSkKLQkJCSk7Ci0JCQkKLQkJCXJ1bm5hYmxlLnNjaGVkdWxlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTaGVsbCBnZXRDdXJyZW50U2hlbGwoKSB7Ci0JICAgIHJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQkgIAotCS8vICoqKioqKioqKiogcnVubmFibGUgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIEdlbmVyYXRlRW50aXRpZXNSdW5uYWJsZSBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUNvbmZpZzsKLQkJcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZzsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uIHNlbGVjdGVkVGFibGVzOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKLQkJcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQkJcHJpdmF0ZSBmaW5hbCBJSnBhUHJvamVjdCBwcm9qZWN0OwotCQkKLQkJR2VuZXJhdGVFbnRpdGllc1J1bm5hYmxlKAotCQkJCVBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnIHBhY2thZ2VDb25maWcsCi0JCQkJRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsCi0JCQkJQ29sbGVjdGlvbiBzZWxlY3RlZFRhYmxlcywKLQkJCQlib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwsCi0JCQkJSUpwYVByb2plY3QgcHJvamVjdCwKLQkJCQlFbnRpdHlHZW5lcmF0b3IuT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcgotCQkpIHsKLQkJCXN1cGVyKEpwdFVpTWVzc2FnZXMuRW50aXRpZXNHZW5lcmF0b3Jfam9iTmFtZSk7Ci0JCQl0aGlzLnBhY2thZ2VDb25maWcgPSBwYWNrYWdlQ29uZmlnOwotCQkJdGhpcy5lbnRpdHlDb25maWcgPSBlbnRpdHlDb25maWc7Ci0JCQl0aGlzLnNlbGVjdGVkVGFibGVzID0gc2VsZWN0ZWRUYWJsZXM7Ci0JCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwotCQkJdGhpcy5vdmVyd3JpdGVDb25maXJtZXIgPSBvdmVyd3JpdGVDb25maXJtZXI7Ci0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQkJc2V0UnVsZShwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlQYWNrYWdlR2VuZXJhdG9yLmdlbmVyYXRlRW50aXRpZXModGhpcy5wYWNrYWdlQ29uZmlnLCB0aGlzLmVudGl0eUNvbmZpZywgdGhpcy5zZWxlY3RlZFRhYmxlcywgdGhpcy5vdmVyd3JpdGVDb25maXJtZXIsIG1vbml0b3IpOwotCQkJLy9mb3JjZSByZXNvdXJjZUNoYW5nZUV2ZW50cyB0byBiZSBwb3N0ZWQgYmVmb3JlIHN5bmNocm9uaXppbmcgcGVyc2lzdGVuY2UueG1sCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuY2hlY2twb2ludChmYWxzZSk7Ci0JCQlpZiAoc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCkgewotCQkJCS8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgKm9uZSogcGVyc2lzdGVuY2UueG1sIGZpbGUgcGVyIHByb2plY3QKLQkJCQlJSnBhRmlsZSByZXNvdXJjZSA9IHByb2plY3QuZ2V0UGxhdGZvcm0oKS52YWxpZFBlcnNpc3RlbmNlWG1sRmlsZXMoKS5uZXh0KCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJU3luY2hyb25pemVDbGFzc2VzSm9iIGpvYiA9IG5ldyBTeW5jaHJvbml6ZUNsYXNzZXNKb2IocmVzb3VyY2UuZ2V0RmlsZSgpKTsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBvdmVyd3JpdGUgY29uZmlybWVyICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBPdmVyd3JpdGVDb25maXJtZXIgaW1wbGVtZW50cyBFbnRpdHlHZW5lcmF0b3IuT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkJcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQkJcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZUFsbCA9IGZhbHNlOwotCQlwcml2YXRlIGJvb2xlYW4gc2tpcEFsbCA9IGZhbHNlOwotCi0JCU92ZXJ3cml0ZUNvbmZpcm1lcihTaGVsbCBzaGVsbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlpZiAodGhpcy5vdmVyd3JpdGVBbGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICh0aGlzLnNraXBBbGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5wcm9tcHRVc2VyKGNsYXNzTmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gcHJvbXB0VXNlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkKLQkJCWZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyBkaWFsb2cgPSBuZXcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nKHRoaXMuc2hlbGwsIGNsYXNzTmFtZSk7Ci0JCQkvL2dldCBvbiB0aGUgVUkgdGhyZWFkIHN5bmNocm9ub3VzbHksIG5lZWQgZmVlZGJhY2sgYmVmb3JlIGNvbnRpbnVpbmcKLQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKGRpYWxvZy55ZXMoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChkaWFsb2cueWVzVG9BbGwoKSkgewotCQkJCXRoaXMub3ZlcndyaXRlQWxsID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoZGlhbG9nLm5vKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKGRpYWxvZy5ub1RvQWxsKCkpIHsKLQkJCQl0aGlzLnNraXBBbGwgPSB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBkaWFsb2cgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQkJcHJpdmF0ZSBib29sZWFuIHllcyA9IGZhbHNlOwotCQlwcml2YXRlIGJvb2xlYW4geWVzVG9BbGwgPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIG5vID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBub1RvQWxsID0gZmFsc2U7Ci0KLQkJT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCXNoZWxsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5PdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGl0bGUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0KLQkJCUxhYmVsIHRleHQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCQl0ZXh0LnNldFRleHQoTkxTLmJpbmQoSnB0VWlNZXNzYWdlcy5PdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGV4dCwgdGhpcy5jbGFzc05hbWUpKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQsIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBmYWxzZSk7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBmYWxzZSk7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuTk9fSUQsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsIHRydWUpOwotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQkJc3dpdGNoIChidXR0b25JZCkgewotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQgOgotCQkJCQl0aGlzLnllc1ByZXNzZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQgOgotCQkJCQl0aGlzLnllc1RvQWxsUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fSUQgOgotCQkJCQl0aGlzLm5vUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lEIDoKLQkJCQkJdGhpcy5ub1RvQWxsUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEIDoKLQkJCQkJdGhpcy5jYW5jZWxQcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB5ZXNQcmVzc2VkKCkgewotCQkJdGhpcy55ZXMgPSB0cnVlOwotCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKLQkJCXRoaXMuY2xvc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB5ZXNUb0FsbFByZXNzZWQoKSB7Ci0JCQl0aGlzLnllc1RvQWxsID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbm9QcmVzc2VkKCkgewotCQkJdGhpcy5ubyA9IHRydWU7Ci0JCQl0aGlzLnNldFJldHVybkNvZGUoT0spOwotCQkJdGhpcy5jbG9zZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIG5vVG9BbGxQcmVzc2VkKCkgewotCQkJdGhpcy5ub1RvQWxsID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlib29sZWFuIHllcygpIHsKLQkJCXJldHVybiB0aGlzLnllczsKLQkJfQotCi0JCWJvb2xlYW4geWVzVG9BbGwoKSB7Ci0JCQlyZXR1cm4gdGhpcy55ZXNUb0FsbDsKLQkJfQotCi0JCWJvb2xlYW4gbm8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5ubzsKLQkJfQotCi0JCWJvb2xlYW4gbm9Ub0FsbCgpIHsKLQkJCXJldHVybiB0aGlzLm5vVG9BbGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9nZW5lcmljL0dlbmVyaWNQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9nZW5lcmljL0dlbmVyaWNQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODllYTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZ2VuZXJpYy9HZW5lcmljUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZ2VuZXJpYzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkJhc2VKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGxhdGZvcm1VaSBleHRlbmRzIEJhc2VKcGFQbGF0Zm9ybVVpCi17Ci0JcHVibGljIEdlbmVyaWNQbGF0Zm9ybVVpKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZURETChJSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5kaXNwbGF5Tm90U3VwcG9ydGVkTWVzc2FnZShKcHRVaU1lc3NhZ2VzLkdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUaXRsZSwgSnB0VWlNZXNzYWdlcy5HZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheU5vdFN1cHBvcnRlZE1lc3NhZ2UoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCSAgICBTdHJpbmcgZm9ybWF0dGVkTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBtZXNzYWdlLCAoT2JqZWN0IFtdKShuZXcgU3RyaW5nIFtdIHsgbWVzc2FnZX0pKTsKLQkgICAgU2hlbGwgY3VycmVudFNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oY3VycmVudFNoZWxsLCB0aXRsZSwgZm9ybWF0dGVkTWVzc2FnZSk7CSAgCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0lBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0lBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc2ZmViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBBIHVuaXF1ZSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUga2V5IG9mIGEgTWFwcGluZ1Byb3ZpZGVyIGluIHRoZSBjb3JlCi0JICogKElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGFuZC9vciBJWG1sQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKQotCSAqLwotCVN0cmluZyBrZXkoKTsKLQotCS8qKgotCSAqIEEgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSBsYWJlbCBhcyBhbiBvcHRpb24gaW4gdGhlIG1hcHBpbmcgdHlwZSBjb21ibyBib3ggCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBsYWJlbCgpOwotCi0JLyoqCi0JICogVGhlIElKcGFDb21wb3NpdGUgdGhhdCBjb3JyZXBvbmRzIHRvIHRoaXMgbWFwcGluZyB0eXBlLiAgVGhpcyB3aWxsIGJlIGRpc3BsYXllZAotCSAqIGJ5IHRoZSBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2Ugd2hlbiB0aGUgbWFwcGluZyBrZXkgbWF0Y2hlcyB0aGUga2V5IGdpdmVuCi0JICogYnkgdGhpcyBwcm92aWRlci4gIFRoZSBjb21wb3NpdGVzIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlJSnBhQ29tcG9zaXRlPElBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9JVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSVR5cGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjE0YTU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9JVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBBIHVuaXF1ZSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUga2V5IG9mIGEgTWFwcGluZ1Byb3ZpZGVyIGluIHRoZSBjb3JlCi0JICovCi0JU3RyaW5nIGtleSgpOwotCQotCS8qKgotCSAqIEEgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSBsYWJlbCBhcyBhbiBvcHRpb24gaW4gdGhlIG1hcHBpbmcgdHlwZSBjb21ibyBib3ggCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBsYWJlbCgpOwotCi0JLyoqCi0JICogVGhlIElKcGFDb21wb3NpdGUgdGhhdCBjb3JyZXBvbmRzIHRvIHRoaXMgbWFwcGluZyB0eXBlLiAgVGhpcyB3aWxsIGJlIGRpc3BsYXllZAotCSAqIGJ5IHRoZSBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIHdoZW4gdGhlIG1hcHBpbmcga2V5IG1hdGNoZXMgdGhlIGtleSBnaXZlbgotCSAqIGJ5IHRoaXMgcHJvdmlkZXIuICBUaGUgY29tcG9zaXRlcyB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JSUpwYUNvbXBvc2l0ZSBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGYxYzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUNvbnRlbnROb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRGV0YWlsc1Byb3ZpZGVyIAotCWltcGxlbWVudHMgSUpwYURldGFpbHNQcm92aWRlcgotewotCXB1YmxpYyBKYXZhRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGZpbGVDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRTsKLQl9Ci0JCi0JcHVibGljIElKcGFEZXRhaWxzUGFnZSBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSwgT2JqZWN0IGNvbnRlbnROb2RlSWQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJaWYgKGNvbnRlbnROb2RlSWQuZXF1YWxzKElKYXZhQ29udGVudE5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRCkpIHsKLQkJCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UocGFyZW50Q29tcG9zaXRlLCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50Tm9kZUlkLmVxdWFscyhJSmF2YUNvbnRlbnROb2Rlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JRCkpIHsKLQkJCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShwYXJlbnRDb21wb3NpdGUsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBubyBvcCAgLi4uIGZvciBub3cKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0OWI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZQotCWV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlIAotewotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhOwotCQkKLQkJYnVpbGRNYXBwaW5nTGFiZWwoY29tcG9zaXRlKTsKLQkJCi0JCUNDb21ib1ZpZXdlciBtYXBwaW5nQ29tYm8gPSBidWlsZE1hcHBpbmdDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCW1hcHBpbmdDb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJUGFnZUJvb2sgYm9vayA9IGJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlib29rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMmQyNzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgZXh0ZW5kcwotCQlQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIAotewkKLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsJICAgIAotCSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkKLQkgICAgYnVpbGRUeXBlTWFwcGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0JICAgIAotCQlDQ29tYm9WaWV3ZXIgdHlwZU1hcHBpbmdDb21ibyA9IGJ1aWxkVHlwZU1hcHBpbmdDb21ibyhjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkgICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXR5cGVNYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlQYWdlQm9vayB0eXBlTWFwcGluZ1BhZ2VCb29rID0gYnVpbGRUeXBlTWFwcGluZ1BhZ2VCb29rKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0eXBlTWFwcGluZ1BhZ2VCb29rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9CYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvQmFzaWNNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmFmNmM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9CYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQmFzaWNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQmFzaWNNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmFzaWNNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBCYXNpY01hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQmFzaWNNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0Jhc2ljTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgQmFzaWNDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0RlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMWMzNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0RlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuQmFzaWNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuICJEZWZhdWx0ICgiICsgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0Jhc2ljTGFiZWwgKyAiKSI7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgQmFzaWNDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzQ5MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW1iZWRkZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuICJEZWZhdWx0ICgiICsgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkTGFiZWwgKyAiKSI7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9FbWJlZGRhYmxlVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VtYmVkZGFibGVVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNGE5N2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VtYmVkZGFibGVVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSVR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVtYmVkZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkYWJsZVVpUHJvdmlkZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRUeXBlUGFnZV9FbWJlZGRhYmxlTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRhYmxlQ29tcG9zaXRlKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQ5YWYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbWJlZGRlZElkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRJZExhYmVsOwotCX0KLQkKLQlwdWJsaWMgSUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhOTM3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVtYmVkZGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW50aXR5VWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VudGl0eVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkNDg5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW50aXR5VWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklUeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VWlQcm92aWRlciBpbXBsZW1lbnRzIElUeXBlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfRW50aXR5TGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHlDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9JZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTliMGZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9JZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuSWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSWRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSWRNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBJZE1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSWRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfSWRMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IElkQ29tcG9zaXRlKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTVkMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL01hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk1hbnlUb01hbnlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvTWFueUxhYmVsOwotCX0KLQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgTWFueVRvTWFueUNvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL01hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxODMyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5NYW55VG9PbmVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb09uZUxhYmVsOwotCX0KLQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgTWFueVRvT25lQ29tcG9zaXRlKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTcxNDc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklUeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyIGltcGxlbWVudHMgSVR5cGVNYXBwaW5nVWlQcm92aWRlcgotewotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudFR5cGVQYWdlX01hcHBlZFN1cGVyY2xhc3NMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSUpwYUNvbXBvc2l0ZSBidWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL051bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL051bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzE2MDQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgTnVsbENvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgCi0JCWltcGxlbWVudHMgSUpwYUNvbXBvc2l0ZSAKLQl7Ci0JCU51bGxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBvcHVsYXRlKEVPYmplY3QgbW9kZWwpIHsKLQkJCS8vIG5vIG9wCi0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL051bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzViZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL051bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklUeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSAKLQlpbXBsZW1lbnRzIElKcGFDb21wb3NpdGUgCi0JewotCQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JCU51bGxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQl0aGlzLmNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBvcHVsYXRlKEVPYmplY3QgbW9kZWwpIHsKLQkJCS8vIG5vIG9wCi0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIHRoaXMuY29tcG9zaXRlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMTMwYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuT25lVG9NYW55Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9PbmVUb01hbnlMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9uZVRvTWFueUNvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmEyMjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5PbmVUb09uZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvT25lTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT25lVG9PbmVDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGI0ODExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlRyYW5zaWVudENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX1RyYW5zaWVudExhYmVsOwotCX0KLQkKLQlwdWJsaWMgSUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFRyYW5zaWVudENvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMTRkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuVmVyc2lvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb25NYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVmVyc2lvbkxhYmVsOwotCX0KLQkKLQlwdWJsaWMgSUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFZlcnNpb25Db21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODczYTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9zdHJ1Y3R1cmUvSmF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhQ29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSnBhQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5KcGFKYXZhUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEphdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCAKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEphdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoSnBhSmF2YVBhY2thZ2UuTGl0ZXJhbHMuSlBBX0NPTVBJTEFUSU9OX1VOSVRfX1RZUEVTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEpwYUNvbXBpbGF0aW9uVW5pdC5jbGFzcykpIHsKLQkJCWNhc2UgSnBhSmF2YVBhY2thZ2UuSlBBX0NPTVBJTEFUSU9OX1VOSVRfX1RZUEVTOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKAotCQkJCQluZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJbm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJjODMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhQ29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzSW1hZ2VzOwotCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCAKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAoKElQZXJzaXN0ZW50QXR0cmlidXRlKSBvYmplY3QpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUJhc2ljKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkJBU0lDKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUlkKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLklEKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSVZlcnNpb24pIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuVkVSU0lPTik7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElFbWJlZGRlZCkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTUJFRERFRCk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElFbWJlZGRlZElkKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkVNQkVEREVEX0lEKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU9uZVRvT25lKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk9ORV9UT19PTkUpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJT25lVG9NYW55KSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk9ORV9UT19NQU5ZKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU1hbnlUb09uZSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5NQU5ZX1RPX09ORSk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElNYW55VG9NYW55KSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk1BTllfVE9fTUFOWSk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElUcmFuc2llbnQpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuVFJBTlNJRU5UKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTlVMTF9BVFRSSUJVVEVfTUFQUElORyk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoSVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpKSB7Ci0JCWNhc2UgSnBhQ29yZVBhY2thZ2UuSVBFUlNJU1RFTlRfQVRUUklCVVRFX19NQVBQSU5HOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9zdHJ1Y3R1cmUvSmF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZDViYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhQ29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSnBhSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc0ltYWdlczsKLQotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCAKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIAotCQlJSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKEpwYUphdmFQYWNrYWdlLkxpdGVyYWxzLkpBVkFfUEVSU0lTVEVOVF9UWVBFX19BVFRSSUJVVEVTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlUeXBlTWFwcGluZyBtYXBwaW5nID0gKChJUGVyc2lzdGVudFR5cGUpIG9iamVjdCkuZ2V0TWFwcGluZygpOwotCQkKLQkJCi0JCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUVudGl0eSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTlRJVFkpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJRW1iZWRkYWJsZSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTUJFRERBQkxFKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJSVR5cGUgdHlwZSA9ICgoSVBlcnNpc3RlbnRUeXBlKSBvYmplY3QpLmZpbmRKZHRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBudWxsKSA/ICIiIDogdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkgewotCQkJY2FzZSBKcGFDb3JlUGFja2FnZS5JUEVSU0lTVEVOVF9UWVBFX19NQVBQSU5HX0tFWToKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZCgKLQkJCQkJbmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCW5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQkJCi0JCQljYXNlIEpwYUphdmFQYWNrYWdlLkpBVkFfUEVSU0lTVEVOVF9UWVBFX19BVFRSSUJVVEVTOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKAotCQkJCQluZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJbm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFmMjhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSUpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YVN0cnVjdHVyZVByb3ZpZGVyIGltcGxlbWVudHMgSUpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBmaWxlQ29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEU7Ci0JfQotCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGJ1aWxkQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKG5ldyBKcGFDb3JlSmF2YUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihuZXcgSnBhQ29yZUphdmFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KcGFDb3JlSmF2YUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KcGFDb3JlSmF2YUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDg1MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9zdHJ1Y3R1cmUvSnBhQ29yZUphdmFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLnV0aWwuSnBhSmF2YUFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KLSAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwYUNvcmVKYXZhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQlleHRlbmRzIEpwYUphdmFBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgCi0JCUlDaGFuZ2VOb3RpZmllciwgCi0JCUlEaXNwb3NhYmxlCi17Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkKLQlwdWJsaWMgSnBhQ29yZUphdmFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEphdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIgamF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKcGFDb21waWxhdGlvblVuaXRBZGFwdGVyKCkgewotCQlpZiAoamF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyID0gbmV3IEphdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyIGphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGVyc2lzdGVudFR5cGVBZGFwdGVyKCkgewotCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciA9IG5ldyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gCi0JCQl0aGlzIDogCi0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQkJfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkKLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoamF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlqYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9OdWxsTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiNjY1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9OdWxsTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIE51bGxMYWJlbFByb3ZpZGVyIAotCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgCi17Ci0JcHVibGljIHN0YXRpYyBOdWxsTGFiZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsTGFiZWxQcm92aWRlcigpOwotCQotCQotCXByaXZhdGUgTnVsbExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7fQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9OdWxsVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjRhMjliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIE51bGxUcmVlQ29udGVudFByb3ZpZGVyIAotCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgCi17Ci0JcHVibGljIHN0YXRpYyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQotCQotCXByaXZhdGUgTnVsbFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc0ltYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNhYjkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL0pwdFVpTWFwcGluZ3NJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgSnB0VWlNYXBwaW5nc0ltYWdlcyAKLXsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCQVNJQyA9ICJmdWxsL29iajE2L2Jhc2ljIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTUJFRERBQkxFID0gImZ1bGwvb2JqMTYvZW1iZWRkYWJsZSI7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1CRURERUQgPSAiZnVsbC9vYmoxNi9lbWJlZGRlZCI7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1CRURERURfSUQgPSAiZnVsbC9vYmoxNi9lbWJlZGRlZC1pZCI7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU5USVRZID0gImZ1bGwvb2JqMTYvZW50aXR5IjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTlRJVFlfTUFQUElOR1MgPSAiZnVsbC9vYmoxNi9lbnRpdHktbWFwcGluZ3MiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gImZ1bGwvb2JqMTYvaWQiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTExfQVRUUklCVVRFX01BUFBJTkcgPSAiZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQU5ZX1RPX01BTlkgPSAiZnVsbC9vYmoxNi9tYW55LXRvLW1hbnkiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BTllfVE9fT05FID0gImZ1bGwvb2JqMTYvbWFueS10by1vbmUiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gImZ1bGwvb2JqMTYvbWFwcGVkLXN1cGVyY2xhc3MiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTExfVFlQRV9NQVBQSU5HID0gImZ1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmciOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9ORV9UT19NQU5ZID0gImZ1bGwvb2JqMTYvb25lLXRvLW1hbnkiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9ORV9UT19PTkUgPSAiZnVsbC9vYmoxNi9vbmUtdG8tb25lIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBURU1QT1JBTCA9ICJmdWxsL29iajE2L3RlbXBvcmFsIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUkFOU0lFTlQgPSAiZnVsbC9vYmoxNi90cmFuc2llbnQiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUlNJT04gPSAiZnVsbC9vYmoxNi92ZXJzaW9uIjsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpbWFnZUxvY2F0b3IpIHsKLQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlRGVzY3JpcHRvcihpbWFnZUxvY2F0b3IpLmNyZWF0ZUltYWdlKCk7Ci0JfQotCQotCQotCXByaXZhdGUgSnB0VWlNYXBwaW5nc0ltYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzODBlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMgZXh0ZW5kcyBOTFMgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9tYXBwaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50VHlwZVBhZ2VfRW50aXR5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX0VtYmVkZGFibGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50VHlwZVBhZ2VfTWFwcGVkU3VwZXJjbGFzc0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfQmFzaWNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9UcmFuc2llbnRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9JZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvTWFueUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb09uZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb01hbnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9WZXJzaW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9FbWJlZGRlZElkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfT25lVG9PbmVMYWJlbDsKLQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl90ZW1wb3JhbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fZW51bWVyYXRlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ0Nob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hQ2hvb3Nlcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uVGFibGVDaG9vc2VyX2xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldEVudGl0eUNob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldEVudGl0eUNob29zZXJfYnJvd3NlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbDsKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfaW5zZXJ0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX3RhYmxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmVyc2VKb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uOwotCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2Nhc2NhZGVUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9mZXRjaFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2dlbmVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2pvaW5UYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX3RhcmdldEVudGl0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9qb2luQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX3JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9yZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kZWZhdWx0OwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9zdHJhdGVneTsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVmFsdWVEZWZhdWx0V2l0aE9uZVBhcmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY29sdW1uOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdGVkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdG9yTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3BrX2dlbmVyYXRpb247CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbjsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUdyb3VwOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX25vT3JkZXJpbmc7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfcHJpbWFyeUtleU9yZGVyaW5nOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9yZW1vdmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0U2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nOwkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY2Nlc3NUeXBlQ29tYm9fZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRhRGF0YUNvbXBsZXRlQ29tYm9fRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRUcnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX2RlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9kZWZhdWx0OwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RKb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzVjMzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLy9pZiB0aGVyZSBpcyBvbmx5IDEgam9pbkNvbHVtbiBhbmQgdGhlIHVzZXIgaXMgZWRpdGluZyBpdCwgdGhleSBzaG91bGQgYmUKLS8vYWJsZSB0byBkZWZpbmUgZGVmYXVsdHMuICBvdGhlcndpc2UsIHdlIHByb2JhYmx5IHNob3VsZG4ndCBhbGxvdyBpdC4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8RSBleHRlbmRzIElBYnN0cmFjdEpvaW5Db2x1bW4+IGV4dGVuZHMgRGlhbG9nIHsKLQotCS8vaWYgY3JlYXRpbmcgYSBuZXcgSm9pbkNvbHVtbiwgdGhpcyB3aWxsIGJlIG51bGwsIAotCS8vc3BlY2lmeSB0aGUgSm9pbkNvbHVtbk93bmVyIGluc3RlYWQgaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnV0b3IKLQlwcml2YXRlIEUgam9pbkNvbHVtbjsKLQkKLQlwcml2YXRlIENvbWJvIG5hbWVDb21ibzsKLQlwcml2YXRlIENvbWJvIHJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm87Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHROYW1lU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWROYW1lOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVTZWxlY3RlZDsKLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQotCUFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlBYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBFIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRUaXRsZSgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0VGl0bGUoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICh0aGlzLmpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KGdldEFkZFRpdGxlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KGdldEVkaXRUaXRsZSgpKTsKLQkJfQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkKLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQluYW1lTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19uYW1lKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJdGhpcy5uYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMubmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubmFtZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FKTsKLQkJcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQkKLQkJTGFiZWwgcmVmZXJlbmNlZENvbHVtbk5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJcmVmZXJlbmNlZENvbHVtbk5hbWVMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcmVmZXJlbmNlZENvbHVtbk5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fUkVGRVJFTkNFRF9DT0xVTU4pOwotCQlwb3B1bGF0ZVJlZmVyZW5jZWROYW1lQ29tYm8oKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5hbWVDb21ibygpIHsKLQkJdGhpcy5uYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lQ29tYm8uYWRkKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW0sIGdldEpvaW5Db2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKSk7Ci0JCX0KLQkJVGFibGUgdGFibGUgPSBnZXROYW1lVGFibGUoKTsKLQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHRhYmxlLmNvbHVtbk5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLm5hbWVDb21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJaWYgKGdldEpvaW5Db2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXRoaXMubmFtZUNvbWJvLnNldFRleHQoZ2V0Sm9pbkNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLm5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGdldE5hbWVDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUNvbWJvOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21ibzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFRhYmxlIGdldE5hbWVUYWJsZSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJlZmVyZW5jZWROYW1lQ29tYm8oKSB7Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19kZWZhdWx0V2l0aE9uZVBhcmFtLCBnZXRKb2luQ29sdW1uKCkuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpKTsKLQkJfQotCQlUYWJsZSByZWZlcmVuY2VkTmFtZVRhYmxlID0gZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpOwotCQlpZiAocmVmZXJlbmNlZE5hbWVUYWJsZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWZlcmVuY2VkTmFtZVRhYmxlLmNvbHVtbk5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8uYWRkKChTdHJpbmcpIGkubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpICE9IG51bGwpIHsKLQkJCWlmIChnZXRKb2luQ29sdW1uKCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvLnNldFRleHQoZ2V0Sm9pbkNvbHVtbigpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRSBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHROYW1lU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lU2VsZWN0ZWQ7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZVNlbGVjdGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwkJCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJdGhpcy5kZWZhdWx0TmFtZVNlbGVjdGVkID0gdGhpcy5uYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwOwotCQl0aGlzLnNlbGVjdGVkTmFtZSA9IHRoaXMubmFtZUNvbWJvLmdldFRleHQoKTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVTZWxlY3RlZCA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDA7Ci0JCXRoaXMuc2VsZWN0ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNpY0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNpY0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTI1NDJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzaWNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5EZWZhdWx0RWFnZXJGZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdFRydWVCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW51bUNvbWJvVmlld2VyLkVudW1Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJQmFzaWMgYmFzaWM7Ci0JCi0JcHJpdmF0ZSBDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgZmV0Y2hUeXBlQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgb3B0aW9uYWxDb21ib1ZpZXdlcjsKLQlwcml2YXRlIExvYkNoZWNrQm94IGxvYkNoZWNrQm94OwotCXByaXZhdGUgRW51bUNvbWJvVmlld2VyIHRlbXBvcmFsVHlwZVZpZXdlcjsKLQlwcml2YXRlIEVudW1Db21ib1ZpZXdlciBlbnVtZXJhdGVkVHlwZVZpZXdlcjsKLQkJCi0JcHVibGljIEJhc2ljQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbnRyb2wgZ2VuZXJhbENvbnRyb2wgPSBidWlsZEdlbmVyYWxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBDb2x1bW5Db21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CQkKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRGZXRjaExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hUeXBlQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChmZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUpOwotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRPcHRpb25hbExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRFbnVtQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKG9wdGlvbmFsQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUFRJT05BTCk7Ci0JCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFRlbXBvcmFsTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRW51bUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRlbXBvcmFsVHlwZVZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RFTVBPUkFMKTsKLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkRW51bWVyYXRlZExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRW51bUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoZW51bWVyYXRlZFR5cGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19FTlVNRVJBVEVEKTsKLQotCSAgICB0aGlzLmxvYkNoZWNrQm94ID0gYnVpbGRMb2JDaGVja0JveChnZW5lcmFsQ29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMubG9iQ2hlY2tCb3guZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAobG9iQ2hlY2tCb3guZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19MT0IpOwotCi0JCXJldHVybiBnZW5lcmFsQ29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIExvYkNoZWNrQm94IGJ1aWxkTG9iQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IExvYkNoZWNrQm94KHBhcmVudCwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5iYXNpYyA9IChJQmFzaWMpIG9iajsKLQkJaWYgKHRoaXMuYmFzaWMgIT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUodGhpcy5iYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJfQotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBGZXRjaEhvbGRlcih0aGlzLmJhc2ljKSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5wb3B1bGF0ZShuZXcgT3B0aW9uYWxIb2xkZXIodGhpcy5iYXNpYykpOwotCQl0aGlzLmxvYkNoZWNrQm94LnBvcHVsYXRlKHRoaXMuYmFzaWMpOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlci5wb3B1bGF0ZShuZXcgVGVtcG9yYWxUeXBlSG9sZGVyKHRoaXMuYmFzaWMpKTsKLQkJdGhpcy5lbnVtZXJhdGVkVHlwZVZpZXdlci5wb3B1bGF0ZShuZXcgRW51bWVyYXRlZFR5cGVIb2xkZXIodGhpcy5iYXNpYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmxvYkNoZWNrQm94LnBvcHVsYXRlKCk7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMubG9iQ2hlY2tCb3guZGlzcG9zZSgpOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJQmFzaWMgZ2V0QmFzaWMoKSB7Ci0JCXJldHVybiB0aGlzLmJhc2ljOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEZldGNoSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnVtSG9sZGVyIHsKLQkJCi0JCXByaXZhdGUgSUJhc2ljIGJhc2ljOwotCQkKLQkJRmV0Y2hIb2xkZXIoSUJhc2ljIGJhc2ljKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5iYXNpYyA9IGJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljLmdldEZldGNoKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMuYmFzaWMuc2V0RmV0Y2goKERlZmF1bHRFYWdlckZldGNoVHlwZSkgZW51bVNldHRpbmcpOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUJhc2ljLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklCQVNJQ19fRkVUQ0g7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5iYXNpYzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGVudW1WYWx1ZXMoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlLlZBTFVFUy50b0FycmF5KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdFZhbHVlKCkgewotCQkJcmV0dXJuIERlZmF1bHRFYWdlckZldGNoVHlwZS5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiRWFnZXIiOwotCQl9Ci0JfQotCi0JCi0JcHJpdmF0ZSBjbGFzcyBPcHRpb25hbEhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElCYXNpYyBiYXNpYzsKLQkJCi0JCU9wdGlvbmFsSG9sZGVyKElCYXNpYyBiYXNpYykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYmFzaWMgPSBiYXNpYzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5iYXNpYy5nZXRPcHRpb25hbCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmJhc2ljLnNldE9wdGlvbmFsKChEZWZhdWx0VHJ1ZUJvb2xlYW4pIGVudW1TZXR0aW5nKTsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJQmFzaWMuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUJBU0lDX19PUFRJT05BTDsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCS8vVE9ETyBtb3ZlIHRoaXMgb3V0IG9mIHRoZSBVSSBpbnRvIHRoZSBtb2RlbAotCQkJcmV0dXJuICJUcnVlIjsKLQkJfQotCi0JfQotCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZW1wb3JhbFR5cGVIb2xkZXIgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudW1Ib2xkZXIgewotCQkKLQkJcHJpdmF0ZSBJQmFzaWMgYmFzaWM7Ci0JCQotCQlUZW1wb3JhbFR5cGVIb2xkZXIoSUJhc2ljIGJhc2ljKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5iYXNpYyA9IGJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljLmdldFRlbXBvcmFsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMuYmFzaWMuc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSkgZW51bVNldHRpbmcpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElCYXNpYy5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQkFTSUNfX1RFTVBPUkFMOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuYmFzaWM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBlbnVtVmFsdWVzKCkgewotCQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogVGVtcG9yYWxUeXBlIGhhcyBubyBEZWZhdWx0LCByZXR1cm4gbnVsbAotCQkgKi8KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFRlbXBvcmFsVHlwZSBoYXMgbm8gRGVmYXVsdCwgcmV0dXJuIG51bGwKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRW51bWVyYXRlZFR5cGVIb2xkZXIgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudW1Ib2xkZXIgewotCQkKLQkJcHJpdmF0ZSBJQmFzaWMgYmFzaWM7Ci0JCQotCQlFbnVtZXJhdGVkVHlwZUhvbGRlcihJQmFzaWMgYmFzaWMpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJhc2ljID0gYmFzaWM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuYmFzaWMuZ2V0RW51bWVyYXRlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmJhc2ljLnNldEVudW1lcmF0ZWQoKEVudW1UeXBlKSBlbnVtU2V0dGluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUJhc2ljLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklCQVNJQ19fRU5VTUVSQVRFRDsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBFbnVtVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBFbnVtVHlwZS5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiT3JkaW5hbCI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Nhc2NhZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmViMGViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDYXNjYWRlQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLXsKLQlwcml2YXRlIElSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmc7CQotCXByaXZhdGUgSUNhc2NhZGUgY2FzY2FkZTsKLQkKLQlwcml2YXRlIEFkYXB0ZXIgcmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyOwotCXByaXZhdGUgQWRhcHRlciBjYXNjYWRlTGlzdGVuZXI7Ci0JCi0JCi0JcHJpdmF0ZSBCdXR0b24gYWxsQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcGVyc2lzdENoZWNrQm94OwotCXByaXZhdGUgQnV0dG9uIG1lcmdlQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcmVmcmVzaENoZWNrQm94OwotCQotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIgPSBidWlsZFJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcigpOwotCQl0aGlzLmNhc2NhZGVMaXN0ZW5lciA9IGJ1aWxkQ2FzY2FkZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcmVsYXRpb25zaGlwTWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRDYXNjYWRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQljYXNjYWRlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCUdyb3VwIGNhc2NhZGVHcm91cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChjb21wb3NpdGUsICJDYXNjYWRlIik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpOwotCQljYXNjYWRlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlHcmlkRGF0YSBncmlkRGF0YTsKLQkJCi0JCXRoaXMuYWxsQ2hlY2tCb3ggPSBjcmVhdGVBbGxDaGVja0JveChjYXNjYWRlR3JvdXApOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLmFsbENoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucGVyc2lzdENoZWNrQm94ID0gY3JlYXRlUGVyc2lzdENoZWNrQm94KGNhc2NhZGVHcm91cCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMucGVyc2lzdENoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMubWVyZ2VDaGVja0JveCA9IGNyZWF0ZU1lcmdlQ2hlY2tCb3goY2FzY2FkZUdyb3VwKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJdGhpcy5tZXJnZUNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucmVtb3ZlQ2hlY2tCb3ggPSBjcmVhdGVSZW1vdmVDaGVja0JveChjYXNjYWRlR3JvdXApOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLnJlbW92ZUNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucmVmcmVzaENoZWNrQm94ID0gY3JlYXRlUmVmcmVzaENoZWNrQm94KGNhc2NhZGVHcm91cCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMucmVmcmVzaENoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVBbGxDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIkFsbCIsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5hbGxTZWxlY3RlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMuYWxsU2VsZWN0ZWQoZSk7CQkJCQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWxsU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlib29sZWFuIHNldFNlbGVjdGlvbiA9IGluaXRpYWxpemVDYXNjYWRlKCk7Ci0JCWlmIChzZXRTZWxlY3Rpb24pIHsKLQkJCXRoaXMuY2FzY2FkZS5zZXRBbGwodGhpcy5hbGxDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVDYXNjYWRlKCkgewotCQlpZiAoYWxsQ2hlY2tCb3hlc0ZhbHNlKCkgJiYgdGhpcy5jYXNjYWRlICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGUobnVsbCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHRoaXMuY2FzY2FkZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmNhc2NhZGUgPSB0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuY3JlYXRlQ2FzY2FkZSgpOwotCQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGUodGhpcy5jYXNjYWRlKTsKLQkJCWVuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVQZXJzaXN0Q2hlY2tCb3goQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJQZXJzaXN0IiwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnBlcnNpc3RTZWxlY3RlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMucGVyc2lzdFNlbGVjdGVkKGUpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcnNpc3RTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWJvb2xlYW4gc2V0U2VsZWN0aW9uID0gaW5pdGlhbGl6ZUNhc2NhZGUoKTsKLQkJaWYgKHNldFNlbGVjdGlvbikgewotCQkJdGhpcy5jYXNjYWRlLnNldFBlcnNpc3QodGhpcy5wZXJzaXN0Q2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlTWVyZ2VDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIk1lcmdlIiwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLm1lcmdlU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLm1lcmdlU2VsZWN0ZWQoZSk7CQkJCQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbWVyZ2VTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWJvb2xlYW4gc2V0U2VsZWN0aW9uID0gaW5pdGlhbGl6ZUNhc2NhZGUoKTsKLQkJaWYgKHNldFNlbGVjdGlvbikgewotCQkJdGhpcy5jYXNjYWRlLnNldE1lcmdlKHRoaXMubWVyZ2VDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmVtb3ZlQ2hlY2tCb3goQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJSZW1vdmUiLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMucmVtb3ZlU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnJlbW92ZVNlbGVjdGVkKGUpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBzZXRTZWxlY3Rpb24gPSBpbml0aWFsaXplQ2FzY2FkZSgpOwotCQlpZiAoc2V0U2VsZWN0aW9uKSB7Ci0JCQl0aGlzLmNhc2NhZGUuc2V0UmVtb3ZlKHRoaXMucmVtb3ZlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVJlZnJlc2hDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIlJlZnJlc2giLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMucmVmcmVzaFNlbGVjdGVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5yZWZyZXNoU2VsZWN0ZWQoZSk7CQkJCQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBzZXRTZWxlY3Rpb24gPSBpbml0aWFsaXplQ2FzY2FkZSgpOwotCQlpZiAoc2V0U2VsZWN0aW9uKSB7Ci0JCQl0aGlzLmNhc2NhZGUuc2V0UmVmcmVzaCh0aGlzLnJlZnJlc2hDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFsbENoZWNrQm94ZXNGYWxzZSgpIHsKLQkJcmV0dXJuICEodGhpcy5hbGxDaGVja0JveC5nZXRTZWxlY3Rpb24oKSAKLQkJCQl8fCB0aGlzLnBlcnNpc3RDaGVja0JveC5nZXRTZWxlY3Rpb24oKSAKLQkJCQl8fCB0aGlzLm1lcmdlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgCi0JCQkJfHwgdGhpcy5yZW1vdmVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSAKLQkJCQl8fCB0aGlzLnJlZnJlc2hDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCByZWxhdGlvbnNoaXBNYXBwaW5nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKSA9PSAKLQkJCQlKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklSRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLmNhc2NhZGUgIT0gbnVsbCkgewotCQkJCQkJCWRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJCQkJfQotCQkJCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLmNhc2NhZGUgPSBDYXNjYWRlQ29tcG9zaXRlLnRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQkJCQlwb3B1bGF0ZUNhc2NhZGUoKTsKLQkJCQkJCQotCQkJCQkJaWYgKENhc2NhZGVDb21wb3NpdGUudGhpcy5jYXNjYWRlICE9IG51bGwpIHsKLQkJCQkJCQllbmdhZ2VDYXNjYWRlTGlzdGVuZXIoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjYXNjYWRlQ2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQ2FzY2FkZS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ0FTQ0FERV9fQUxMIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5hbGxDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNBU0NBREVfX1BFUlNJU1QgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnBlcnNpc3RDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNBU0NBREVfX01FUkdFIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5tZXJnZUNoZWNrQm94LnNldFNlbGVjdGlvbihub3RpZmljYXRpb24uZ2V0TmV3Qm9vbGVhblZhbHVlKCkpOwotCQkJCQkJfQotCQkJCQl9KTsJCQkKLQkJCQlicmVhazsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ0FTQ0FERV9fUkVNT1ZFIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5yZW1vdmVDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNBU0NBREVfX1JFRlJFU0ggOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnJlZnJlc2hDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQ2FzY2FkZS5jbGFzcykgPT0gCi0JCQkJSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ0FTQ0FERV9fQUxMKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5hbGxDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nID0gKElSZWxhdGlvbnNoaXBNYXBwaW5nKSBvYmo7Ci0JCQotCQlpZiAodGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMuY2FzY2FkZSA9IHRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQlwb3B1bGF0ZUNhc2NhZGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDYXNjYWRlKCkgewotCQlpZiAodGhpcy5jYXNjYWRlICE9IG51bGwpIHsKLQkJCXRoaXMuYWxsQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuY2FzY2FkZS5pc0FsbCgpKTsKLQkJCXRoaXMucGVyc2lzdENoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQkJdGhpcy5tZXJnZUNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJCXRoaXMucmVtb3ZlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJCXRoaXMucmVmcmVzaENoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5hbGxDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5wZXJzaXN0Q2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMubWVyZ2VDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5yZW1vdmVDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5yZWZyZXNoQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmNhc2NhZGUgIT0gbnVsbCkgewotCQkJCWVuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpIHsKLQkJdGhpcy5jYXNjYWRlLmVBZGFwdGVycygpLmFkZCh0aGlzLmNhc2NhZGVMaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpIHsKLQkJdGhpcy5jYXNjYWRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmNhc2NhZGVMaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmNhc2NhZGUgIT0gbnVsbCkgewotCQkJCWRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXRhbG9nQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2F0YWxvZ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MWQwMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXRhbG9nQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENhdGFsb2dDb21ibyBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBJVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDYWNoaW5nIHRoZSBjb25uZWN0aW9uUHJvZmlsZSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZSBsaXN0ZW5lci4gSWYgdGhlCi0JICogY2FjaGVkIHRhYmxlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsIHRoZW4gd2Ugbm8gbG9uZ2VyCi0JICogaGF2ZSBhY2Nlc3MgdG8gdGhlIHBhcmVudCBhbmQgY2Fubm90IGZpbmQgdGhlIGNvbm5lY3Rpb25Qcm9maWxlCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JcHVibGljIENhdGFsb2dDb21ibyhDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFRhYmxlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlDYXRhbG9nQ29tYm8udGhpcy5jYXRhbG9nQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb21ibygpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUNhdGFsb2dDb21iby50aGlzLnBvcHVsYXRlQ2F0YWxvZ0NvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZGF0YWJhc2UgPT0gQ2F0YWxvZ0NvbWJvLnRoaXMuZ2V0RGF0YWJhc2UoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJdGhpcy5jb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCXRoaXMuY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIGNhdGFsb2dUZXh0ID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAoY2F0YWxvZ1RleHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNhdGFsb2dUZXh0ID0gbnVsbDsKLQkJCQkJaWYgKENhdGFsb2dDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsIHx8IENhdGFsb2dDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2F0YWxvZ1RleHQgIT0gbnVsbCAmJiBjb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgY2F0YWxvZ1RleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCWNhdGFsb2dUZXh0ID0gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKENhdGFsb2dDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsICYmIGNhdGFsb2dUZXh0ICE9IG51bGwpIHsKLQkJCQkJQ2F0YWxvZ0NvbWJvLnRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nVGV4dCk7Ci0JCQkJfQotCQkJCWlmIChDYXRhbG9nQ29tYm8udGhpcy50YWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgIT0gbnVsbCAmJiAhQ2F0YWxvZ0NvbWJvLnRoaXMudGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpLmVxdWFscyhjYXRhbG9nVGV4dCkpIHsKLQkJCQkJQ2F0YWxvZ0NvbWJvLnRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nVGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQkJdGhpcy50YWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKGNhdGFsb2dOYW1lKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnNldENhdGFsb2dOYW1lKGNhdGFsb2dOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYXRhbG9nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9DQVRBTE9HKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dOYW1lKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX0NBVEFMT0cpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCUNhdGFsb2dDb21iby50aGlzLnBvcHVsYXRlRGVmYXVsdENhdGFsb2dOYW1lKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMudGFibGUgPSAoSVRhYmxlKSBvYmo7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMucG9wdWxhdGVDYXRhbG9nQ29tYm8oKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLnRhYmxlLmdldEpwYVByb2plY3QoKS5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNhdGFsb2dDb21ibygpIHsKLQkJaWYgKHRoaXMudGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMucG9wdWxhdGVEZWZhdWx0Q2F0YWxvZ05hbWUoKTsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJCWlmIChkYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3I8U3RyaW5nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmNhdGFsb2dOYW1lcygpOwotCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydChjYXRhbG9ncyk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXRoaXMuY29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlKDEsIHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxKTsKLQkJfQotCQl0aGlzLnBvcHVsYXRlQ2F0YWxvZ05hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlZmF1bHRDYXRhbG9nTmFtZSgpIHsKLQkJLy8gU3RyaW5nIGRlZmF1bHRDYXRhbG9nTmFtZSA9IHRoaXMudGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKTsgLy8KLQkJLy8gRGVmYXVsdENhdGFsb2cgY2Fubm90IGJlIGluaXRpYWxpemVkIGlmIERCIG5vdCBvbmxpbmUKLQkJU3RyaW5nIGRlZmF1bHRDYXRhbG9nTmFtZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0Q2F0YWxvZ05hbWUoKTsgLy8gVE9SRVZJRVcKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJY29tYm8uc2V0SXRlbSgwLCBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdENhdGFsb2dOYW1lKSk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQljb21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDYXRhbG9nTmFtZSgpIHsKLQkJaWYgKHRoaXMudGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBjYXRhbG9nTmFtZSA9IHRoaXMudGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQkvLyBTdHJpbmcgZGVmYXVsdENhdGFsb2dOYW1lID0gdGhpcy50YWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpOyAvLwotCQkvLyBEZWZhdWx0Q2F0YWxvZyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgaWYgREIgbm90IG9ubGluZQotCQlTdHJpbmcgZGVmYXVsdENhdGFsb2dOYW1lID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRDYXRhbG9nTmFtZSgpOyAvLyBUT1JFVklFVwotCQlpZiAoIVN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY2F0YWxvZ05hbWUpKSB7Ci0JCQlpZiAoIXRoaXMuY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjYXRhbG9nTmFtZSkpIHsKLQkJCQl0aGlzLmNvbWJvLnNldFRleHQoY2F0YWxvZ05hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLmNvbWJvLmdldFRleHQoKS5lcXVhbHMoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRDYXRhbG9nTmFtZSkpKSB7Ci0JCQkJdGhpcy5jb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ0NvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5jb21ibzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZ2V0Q29tYm8oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLnRhYmxlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMudGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy50YWJsZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5saXN0ZW5lcik7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29sdW1uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDJmNzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdFRydWVCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnVtQ29tYm9WaWV3ZXIuRW51bUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8vVE9ETyByZXBvcHVsYXRlIHRoaXMgcGFuZWwgYmFzZWQgb24gdGhlIEVudGl0eSB0YWJsZSBjaGFuZ2luZwotcHVibGljIGNsYXNzIENvbHVtbkNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQkKLQlwcml2YXRlIElDb2x1bW4gY29sdW1uOwotCi0JcHJpdmF0ZSBBZGFwdGVyIGNvbHVtbkxpc3RlbmVyOwotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQkJCi0JcHJvdGVjdGVkIENDb21ibyBjb2x1bW5Db21ibzsKLQlwcm90ZWN0ZWQgQ0NvbWJvIHRhYmxlQ29tYm87Ci0JcHJvdGVjdGVkIEVudW1Db21ib1ZpZXdlciBpbnNlcnRhYmxlQ29tYm9WaWV3ZXI7Ci0JcHJvdGVjdGVkIEVudW1Db21ib1ZpZXdlciB1cGRhdGFibGVDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGU7Ci0JCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuY29sdW1uTGlzdGVuZXIgPSBidWlsZENvbHVtbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQ29sdW1uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQljb2x1bW5DaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0gICAgcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJQ29sdW1uQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJQ29sdW1uQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlDb2x1bW5Db21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBTY2hlbWEgc2NoZW1hKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBUYWJsZSB0YWJsZSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmKHRhYmxlID09IGdldERiVGFibGUoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlDb2x1bW5Db21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0gICAgfQotICAgIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsJCQotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCQkKLQkJR3JvdXAgY29sdW1uR3JvdXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlR3JvdXAoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2NvbHVtblNlY3Rpb24pOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsJCQkJCi0JCWNvbHVtbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJY29sdW1uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy9jcmVhdGVkIHRoaXMgY29tcG9zaXRlIGJlY2F1c2UgY29tYm9zIGFzIGRpcmVjdCBjaGlsZHJlbiBvZiBhIEdyb3VwIGRvIG5vdCBoYXZlIGEgYm9yZGVyLCBubyBjbHVlIHdoeQotCQlDb21wb3NpdGUgaW50ZXJtZWRpYXJ5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb2x1bW5Hcm91cCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsJCQotCQlpbnRlcm1lZGlhcnlDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRDb2x1bW5MYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLmNvbHVtbkNvbWJvID0gYnVpbGRDb2x1bW5Db21ibyhpbnRlcm1lZGlhcnlDb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuY29sdW1uQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChjb2x1bW5Db21ibywgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OKTsKLQkJCi0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkQ29sdW1uVGFibGVMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLnRhYmxlQ29tYm8gPSBidWlsZFRhYmxlQ29tYm8oaW50ZXJtZWRpYXJ5Q29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnRhYmxlQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0YWJsZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVEFCTEUpOwotCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZSk7Ci0KLQkJdGhpcy5pbnNlcnRhYmxlQ29tYm9WaWV3ZXIgPSBuZXcgRW51bUNvbWJvVmlld2VyKGludGVybWVkaWFyeUNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUpOwotCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlKTsKLQotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyID0gbmV3IEVudW1Db21ib1ZpZXdlcihpbnRlcm1lZGlhcnlDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBDQ29tYm8gYnVpbGRDb2x1bW5Db21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0gIAkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIGNvbHVtblRleHQgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCWlmIChjb2x1bW5UZXh0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljb2x1bW5UZXh0ID0gbnVsbDsKLQkJCQkJaWYgKGNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb2x1bW5UZXh0ICE9IG51bGwgJiYgY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIGNvbHVtblRleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCWNvbHVtblRleHQgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgJiYgY29sdW1uVGV4dCAhPSBudWxsKSB7Ci0JCQkJCWNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtblRleHQpOwotCQkJCX0KLQkJCQlpZiAoY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSAhPSBudWxsICYmICFjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscyhjb2x1bW5UZXh0KSkgewotCQkJCQljb2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5UZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCXByaXZhdGUgQ0NvbWJvIGJ1aWxkVGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0gIAkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRhYmxlVGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRhYmxlVGV4dC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFibGVUZXh0ID0gbnVsbDsKLQkJCQkJaWYgKGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwgfHwgY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHRhYmxlVGV4dCAhPSBudWxsICYmIGNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0YWJsZVRleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXRhYmxlVGV4dCA9IG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwgJiYgdGFibGVUZXh0ICE9IG51bGwpIHsKLQkJCQkJY29sdW1uLnNldFNwZWNpZmllZFRhYmxlKHRhYmxlVGV4dCk7Ci0JCQkJfQotCQkJCWlmIChjb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSAhPSBudWxsICYmICFjb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKS5lcXVhbHModGFibGVUZXh0KSkgewotCQkJCQljb2x1bW4uc2V0U3BlY2lmaWVkVGFibGUodGFibGVUZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb2x1bW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX1NQRUNJRklFRF9OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkgfHwgaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZUNvbHVtbk5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19ERUZBVUxUX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlRGVmYXVsdENvbHVtbk5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19ERUZBVUxUX1RBQkxFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZURlZmF1bHRDb2x1bW5UYWJsZSgpOwotCQkJCQlwb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQWJzdHJhY3RDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0NPTFVNTl9fU1BFQ0lGSUVEX1RBQkxFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZUNvbHVtblRhYmxlKCk7Ci0JCQkJCXBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtbi5lQWRhcHRlcnMoKS5hZGQodGhpcy5jb2x1bW5MaXN0ZW5lcik7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCXRoaXMuY29sdW1uLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmNvbHVtbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmNvbHVtbi5nZXRKcGFQcm9qZWN0KCkuY29ubmVjdGlvblByb2ZpbGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIFRhYmxlIGdldERiVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5kYlRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sdW1uQ29tYm8oKSB7Ci0JCS8vVE9ETyBkb24ndCBkbyBpbnN0YW5jZW9mIGNoZWNrIGhlcmUgLSBjaGVjayBvbiBUYWJsZSwgb3IgaXNSb290IGNoZWNrIG9uIEVudGl0eQotCQkvL3RoaXMudGFibGVDb21iby5zZXRFbmFibGVkKCEodGhpcy50YWJsZSBpbnN0YW5jZW9mIFNpbmdsZVRhYmxlSW5oZXJpdGFuY2VDaGlsZFRhYmxlSW1wbCkpOwotCQlwb3B1bGF0ZURlZmF1bHRDb2x1bW5OYW1lKCk7Ci0KLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbHVtbkNvbWJvLmdldEl0ZW1Db3VudCgpLTEpOwotCQkJVGFibGUgdGFibGUgPSBnZXREYlRhYmxlKCk7Ci0JCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KENvbGxlY3Rpb25Ub29scy5saXN0KHRhYmxlLmNvbHVtbk5hbWVzKCkpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJdGhpcy5jb2x1bW5Db21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29sdW1uQ29tYm8ucmVtb3ZlKDEsIHRoaXMuY29sdW1uQ29tYm8uZ2V0SXRlbUNvdW50KCktMSk7Ci0JCX0KLQkJcG9wdWxhdGVDb2x1bW5OYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCVN0cmluZyBkZWZhdWx0VGFibGVOYW1lID0gY29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IGNvbHVtbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWNvbHVtbkNvbWJvLnNldEl0ZW0oMCwgTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0VGFibGVOYW1lKSk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQkvL2NvbWJvIHRleHQgZG9lcyBub3QgdXBkYXRlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gMiBtYXBwaW5ncyBvZiB0aGUgc2FtZSB0eXBlCi0JCQkvL3RoYXQgYm90aCBoYXZlIGEgZGVmYXVsdCBjb2x1bW4gbmFtZS4gIGNsZWFyIHRoZSBzZWxlY3Rpb24gYW5kIHRoZW4gc2V0IGl0IGFnYWluCi0JCQljb2x1bW5Db21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJY29sdW1uQ29tYm8uc2VsZWN0KDApOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb2x1bW5OYW1lKCkgewotCQlTdHJpbmcgc3BlY2lmaWVkQ29sdW1uTmFtZSA9IHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJaWYgKHNwZWNpZmllZENvbHVtbk5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLmNvbHVtbkNvbWJvLmdldFRleHQoKS5lcXVhbHMoc3BlY2lmaWVkQ29sdW1uTmFtZSkpIHsKLQkJCQl0aGlzLmNvbHVtbkNvbWJvLnNldFRleHQoc3BlY2lmaWVkQ29sdW1uTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZGVmYXVsdENvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJaWYgKCF0aGlzLmNvbHVtbkNvbWJvLmdldFRleHQoKS5lcXVhbHMoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0Q29sdW1uTmFtZSkpKSB7Ci0JCQkJdGhpcy5jb2x1bW5Db21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGFibGVDb21ibygpIHsKLQkJLy9UT0RPIGRvbid0IGRvIGluc3RhbmNlb2YgY2hlY2sgaGVyZSAtIGNoZWNrIG9uIFRhYmxlLCBvciBpc1Jvb3QgY2hlY2sgb24gRW50aXR5Ci0JCS8vdGhpcy50YWJsZUNvbWJvLnNldEVuYWJsZWQoISh0aGlzLnRhYmxlIGluc3RhbmNlb2YgU2luZ2xlVGFibGVJbmhlcml0YW5jZUNoaWxkVGFibGVJbXBsKSk7Ci0JCXBvcHVsYXRlRGVmYXVsdENvbHVtblRhYmxlKCk7Ci0JCXRoaXMudGFibGVDb21iby5yZW1vdmUoMSwgdGhpcy50YWJsZUNvbWJvLmdldEl0ZW1Db3VudCgpLTEpOwotCQkKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHRoaXMuY29sdW1uLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy50YWJsZUNvbWJvLmFkZCgoU3RyaW5nKSBpLm5leHQoKSk7CQkJCi0JCQl9Ci0JCX0KLQkJcG9wdWxhdGVDb2x1bW5UYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlZmF1bHRDb2x1bW5UYWJsZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUgPSBjb2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJdGFibGVDb21iby5zZXRJdGVtKDAsIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdFRhYmxlTmFtZSkpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggPT0gMCkgewotCQkJLy9jb21ibyB0ZXh0IGRvZXMgbm90IHVwZGF0ZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIDIgbWFwcGluZ3Mgb2YgdGhlIHNhbWUgdHlwZQotCQkJLy90aGF0IGJvdGggaGF2ZSBhIGRlZmF1bHQgY29sdW1uIG5hbWUuICBjbGVhciB0aGUgc2VsZWN0aW9uIGFuZCB0aGVuIHNldCBpdCBhZ2FpbgotCQkJdGFibGVDb21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJdGFibGVDb21iby5zZWxlY3QoMCk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNvbHVtblRhYmxlKCkgewotCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUgPSB0aGlzLmNvbHVtbi5nZXREZWZhdWx0VGFibGUoKTsKLQkJaWYgKHRhYmxlTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMudGFibGVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHRhYmxlTmFtZSkpIHsKLQkJCQl0aGlzLnRhYmxlQ29tYm8uc2V0VGV4dCh0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRUYWJsZU5hbWUpKSkgewotCQkJCXRoaXMudGFibGVDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuY29sdW1uID0gKElDb2x1bW4pIG9iajsKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLQkJCXBvcHVsYXRlVGFibGVDb21ibygpOwotCQl9Ci0JCXRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBJbnNlcnRhYmxlSG9sZGVyKHRoaXMuY29sdW1uKSk7Ci0JCXRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIucG9wdWxhdGUobmV3IFVwZGF0YWJsZUhvbGRlcih0aGlzLmNvbHVtbikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlpZiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgewotCQkJcG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJcG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJfQotCQl0aGlzLmluc2VydGFibGVDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuY29sdW1uQ29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy50YWJsZUNvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmluc2VydGFibGVDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSW5zZXJ0YWJsZUhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElBYnN0cmFjdENvbHVtbiBjb2x1bW47Ci0JCQotCQlJbnNlcnRhYmxlSG9sZGVyKElBYnN0cmFjdENvbHVtbiBjb2x1bW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmNvbHVtbi5zZXRJbnNlcnRhYmxlKChEZWZhdWx0VHJ1ZUJvb2xlYW4pIGVudW1TZXR0aW5nKTsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElBYnN0cmFjdENvbHVtbi5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19JTlNFUlRBQkxFOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCS8vVE9ETyBtb3ZlIHRoaXMgb3V0IG9mIHRoZSBVSSBpbnRvIHRoZSBtb2RlbAotCQkJcmV0dXJuICJUcnVlIjsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVXBkYXRhYmxlSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnVtSG9sZGVyIHsKLQkJCi0JCXByaXZhdGUgSUFic3RyYWN0Q29sdW1uIGNvbHVtbjsKLQkJCi0JCVVwZGF0YWJsZUhvbGRlcihJQWJzdHJhY3RDb2x1bW4gY29sdW1uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFVwZGF0YWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmNvbHVtbi5zZXRVcGRhdGFibGUoKERlZmF1bHRUcnVlQm9vbGVhbikgZW51bVNldHRpbmcpOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUFic3RyYWN0Q29sdW1uLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRTsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGVudW1WYWx1ZXMoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLlZBTFVFUy50b0FycmF5KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdFZhbHVlKCkgewotCQkJcmV0dXJuIERlZmF1bHRUcnVlQm9vbGVhbi5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiVHJ1ZSI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NvbW1vbldpZGdldHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29tbW9uV2lkZ2V0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc5NjZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29tbW9uV2lkZ2V0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRMYXp5RmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRUcnVlQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQWJzdHJhY3RDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnVtQ29tYm9WaWV3ZXIuRW51bUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5TdHJpbmdXaXRoRGVmYXVsdENob29zZXIuU3RyaW5nSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uV2lkZ2V0cyAKLXsKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkRW50aXR5TmFtZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbnRpdHlOYW1lQ29tYm8gYnVpbGRFbnRpdHlOYW1lQ29tYm8oCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW50aXR5TmFtZUNvbWJvKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZFRhYmxlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNob29zZXJfbGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkQ2F0YWxvZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ2F0YWxvZ0Nob29zZXJfbGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkU2NoZW1hTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TY2hlbWFDaG9vc2VyX2xhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIgYnVpbGRTdHJpbmdXaXRoRGVmYXVsdENob29zZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRGZXRjaExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9mZXRjaExhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZFRhcmdldEVudGl0eUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9sYWJlbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRPcHRpb25hbExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZFRlbXBvcmFsTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX3RlbXBvcmFsTGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkRW51bWVyYXRlZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9lbnVtZXJhdGVkTGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkTWFwcGVkQnlMYWJlbChDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRW51bUNvbWJvVmlld2VyIGJ1aWxkRmV0Y2hUeXBlQ29tYm9WaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW51bUNvbWJvVmlld2VyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVudW1Db21ib1ZpZXdlciBidWlsZEVudW1Db21ib1ZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbnVtQ29tYm9WaWV3ZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVudW1Ib2xkZXIgYnVpbGRNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEVudW1Ib2xkZXIoSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgRmV0Y2hIb2xkZXIobWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRW51bUhvbGRlciBidWlsZFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEVudW1Ib2xkZXIoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbmV3IFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEhvbGRlcihtYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFbnVtSG9sZGVyIGJ1aWxkT3B0aW9uYWxIb2xkZXIoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9wdGlvbmFsSG9sZGVyKG1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkQ29sdW1uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5DaG9vc2VyX2xhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZENvbHVtblRhYmxlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5UYWJsZUNob29zZXJfbGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbHVtblRhYmxlSG9sZGVyIGJ1aWxkQ29sdW1uVGFibGVIb2xkZXIoSUNvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5UYWJsZUhvbGRlcihjb2x1bW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGFyZ2V0RW50aXR5Q2hvb3NlciBidWlsZFRhcmdldEVudGl0eUNob29zZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFRhcmdldEVudGl0eUNob29zZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGZXRjaEhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZzsKLQkJCi0JCUZldGNoSG9sZGVyKElNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubWFwcGluZyA9IG1hcHBpbmc7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRGZXRjaCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLm1hcHBpbmcuc2V0RmV0Y2goKERlZmF1bHRMYXp5RmV0Y2hUeXBlKSBlbnVtU2V0dGluZyk7Ci0JCQkKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklNVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0TGF6eUZldGNoVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0TGF6eUZldGNoVHlwZS5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiTGF6eSI7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0ZldGNoSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnVtSG9sZGVyIHsKLQkJCi0JCXByaXZhdGUgSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZzsKLQkJCi0JCVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEhvbGRlcihJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tYXBwaW5nID0gbWFwcGluZzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldEZldGNoKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMubWFwcGluZy5zZXRGZXRjaCgoRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlKSBlbnVtU2V0dGluZyk7Ci0JCQkKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBlbnVtVmFsdWVzKCkgewotCQkJcmV0dXJuIERlZmF1bHRFYWdlckZldGNoVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0RWFnZXJGZXRjaFR5cGUuREVGQVVMVDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0U3RyaW5nKCkgewotCQkJLy9UT0RPIG1vdmUgdGhpcyBvdXQgb2YgdGhlIFVJIGludG8gdGhlIG1vZGVsCi0JCQlyZXR1cm4gIkVhZ2VyIjsKLQkJfQotCX0JCi0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQlwcml2YXRlIElBYnN0cmFjdENvbHVtbiBjb2x1bW47Ci0JCQotCQlDb2x1bW5Ib2xkZXIoSUFic3RyYWN0Q29sdW1uIGNvbHVtbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElBYnN0cmFjdENvbHVtbi5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWZhdWx0KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJQWJzdHJhY3RDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29sdW1uVGFibGVIb2xkZXIgZXh0ZW5kcyBDb2x1bW5Ib2xkZXIgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQkKLQkJQ29sdW1uVGFibGVIb2xkZXIoSUFic3RyYWN0Q29sdW1uIGNvbHVtbikgewotCQkJc3VwZXIoY29sdW1uKTsKLQkJfQotCQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0NPTFVNTl9fU1BFQ0lGSUVEX1RBQkxFOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGRlZmF1bHRGZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19ERUZBVUxUX1RBQkxFOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRJdGVtKCkgewotCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCQlpZiAoZGVmYXVsdE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHROYW1lKTsKLQkJCX0KLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlnZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShuZXdOYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPcHRpb25hbEhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmc7Ci0JCQotCQlPcHRpb25hbEhvbGRlcihJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tYXBwaW5nID0gbWFwcGluZzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldE9wdGlvbmFsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMubWFwcGluZy5zZXRPcHRpb25hbCgoRGVmYXVsdFRydWVCb29sZWFuKSBlbnVtU2V0dGluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVNJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCS8vVE9ETyBtb3ZlIHRoaXMgb3V0IG9mIHRoZSBVSSBpbnRvIHRoZSBtb2RlbAotCQkJcmV0dXJuICJUcnVlIjsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzk4ZWIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJRW1iZWRkYWJsZSBlbWJlZGRhYmxlOwotCXByaXZhdGUgQWRhcHRlciBtYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotCQotCQotCXB1YmxpYyBFbWJlZGRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXIgPSBidWlsZE1hcHBlZFN1cGVyY2xhc3NMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRNYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCW1hcHBlZFN1cGVyY2xhc3NDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQkKLS8vCQlMYWJlbCBhY2Nlc3NUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0vLwkJYWNjZXNzVHlwZUxhYmVsLnNldFRleHQoRGFsaVVpTWVzc2FnZXMuTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZV9hY2Nlc3NUeXBlKTsKLS8vCQl0aGlzLmFjY2Vzc1R5cGVDb21ib1ZpZXdlciA9IGJ1aWxkQWNjZXNzVHlwZUNvbWJvKGNvbXBvc2l0ZSk7Ci0vLwkJLy9ldmVudHVhbGx5IHRoaXMgd2lsbCBiZSBlbmFibGVkIGlmIGVkaXRpbmcgeG1sIGluc3RlYWQgb2YgamF2YQotLy8JCXRoaXMuYWNjZXNzVHlwZUNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLS8vCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLS8vCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLS8vCQl0aGlzLmFjY2Vzc1R5cGVDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5hY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKSwgSURhbGlIZWxwQ29udGV4dElkcy5FTlRJVFlfQUNDRVNTX1RZUEUpOwotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIENvbWJvVmlld2VyIGJ1aWxkQWNjZXNzVHlwZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLS8vCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLS8vCQl2aWV3ZXIuYWRkKEFjY2Vzc1R5cGUuVkFMVUVTLnRvQXJyYXkoKSk7Ci0vLwkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLS8vCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLS8vCQkJCWlmIChwb3B1bGF0aW5nKSB7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotLy8JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotLy8JCQkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShTZXRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBwZXJzaXN0ZW50VHlwZSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVudFR5cGVfQWNjZXNzVHlwZSgpLCBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0pOwotLy8JCXJldHVybiB2aWV3ZXI7Ci0vLwl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG1vZGVsKSB7Ci0JCXRoaXMuZW1iZWRkYWJsZSA9IChJRW1iZWRkYWJsZSkgbW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0vLwkJdGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5hZGRMaXN0ZW5lcihnZXRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkpOwotLy8JCXRoaXMucGVyc2lzdGVudFR5cGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLS8vCQlpZiAodGhpcy5wZXJzaXN0ZW50VHlwZSAhPSBudWxsKXsKLS8vCQkJdGhpcy5wZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcik7Ci0vLwkJCXRoaXMucGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIoZ2V0UGVyc2lzdGVudFR5cGVMaXN0ZW5lcigpKTsKLS8vCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYXBwZWRTdXBlcmNsYXNzQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBnZXRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkgewotLy8JCWlmICh0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPT0gbnVsbCkgewotLy8JCQl0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPSBuZXcgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcigpIHsKLS8vCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotLy8JCQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBlcnNpc3RlbnRUeXBlLmNsYXNzKSA9PSBPcm1QYWNrYWdlLlBFUlNJU1RFTlRfVFlQRV9fQUNDRVNTX1RZUEUpIHsKLS8vCQkJCQkJZmluYWwgQWNjZXNzVHlwZSBhY2Nlc3NUeXBlID0gKEFjY2Vzc1R5cGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgYWNjZXNzVHlwZUNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBhY2Nlc3NUeXBlKSB7Ci0vLwkJCQkJCQkJCWFjY2Vzc1R5cGVDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWNjZXNzVHlwZSkpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJfSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9OwotLy8JCX0KLS8vCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50VHlwZUxpc3RlbmVyOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRhMDYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlCi17Ci0JcHJpdmF0ZSBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBJRW1iZWRkZWQgZW1iZWRkZWQ7Ci0JcHJpdmF0ZSBBZGFwdGVyIGVtYmVkZGVkTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGU7Ci0JcHJpdmF0ZSBBZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlTGlzdGVuZXI7Ci0JCQotCXByb3RlY3RlZCBDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlOwotCQotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEJ1dHRvbjsKLQkKLQlwdWJsaWMgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmVtYmVkZGVkTGlzdGVuZXIgPSBidWlsZEVtYmVkZGVkTGlzdGVuZXIoKTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEVtYmVkZGVkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQllbWJlZGRlZENoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyb3VwIGF0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKAotCQkJY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0aGlzLmxpc3RWaWV3ZXIgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RWaWV3ZXIoYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXApOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJdGhpcy5saXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmxpc3RWaWV3ZXIuZ2V0TGlzdCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19FTUJFRERFRF9BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCi0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCwgIk92ZXJyaWRlIERlZmF1bHQiLCBTV1QuQ0hFQ0spOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZE92ZXJyaWRlRGVmYXVsdFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJCi0JCXRoaXMuY29sdW1uQ29tcG9zaXRlID0gbmV3IENvbHVtbkNvbXBvc2l0ZShhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCwgY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkT3ZlcnJpZGVEZWZhdWx0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3ZlcnJpZGVEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvdmVycmlkZURlZmF1bHRCdXR0b25TZWxlY3RlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG92ZXJyaWRlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSB0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbikgewotCQkJaW50IGluZGV4ID0gdGhpcy5lbWJlZGRlZC5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCk7Ci0JCQlJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmVtYmVkZGVkLmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKGluZGV4KTsKLQkJCXRoaXMuZW1iZWRkZWQuZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUodGhpcy5hdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmVtYmVkZGVkLmdldFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIExpc3RWaWV3ZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGlzdFZpZXdlciBsaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0xhYmVsUHJvdmlkZXIoKSk7Ci0JCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzQ29udGVudFByb3ZpZGVyKCkpOwotCQkKLQkJbGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGxpc3RWaWV3ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZmFsc2UpOwotCQkJdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZSA9IGdldFNlbGVjdGVkQXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJCWJvb2xlYW4gc3BlY2lmaWVkT3ZlcnJpZGUgPSB0aGlzLmVtYmVkZGVkLmdldFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNvbnRhaW5zKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHNwZWNpZmllZE92ZXJyaWRlKTsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUuZW5hYmxlV2lkZ2V0cyhzcGVjaWZpZWRPdmVycmlkZSk7Ci0JCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkvL1RPRE8gYWxzbyBkaXNwbGF5IGNvbHVtbiBuYW1lIHNvbWVob3cKLQkJCQlyZXR1cm4gKChJQXR0cmlidXRlT3ZlcnJpZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSUVtYmVkZGVkKSBpbnB1dEVsZW1lbnQpLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElBdHRyaWJ1dGVPdmVycmlkZSBnZXRTZWxlY3RlZEF0dHJpYnV0ZU92ZXJyaWRlKCkgewotCQlyZXR1cm4gKElBdHRyaWJ1dGVPdmVycmlkZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuZW1iZWRkZWQgPSAoSUVtYmVkZGVkKSBvYmo7Ci0JCWlmICh0aGlzLmVtYmVkZGVkID09IG51bGwpIHsKLQkJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmxpc3RWaWV3ZXIuZ2V0SW5wdXQoKSAhPSB0aGlzLmVtYmVkZGVkKSB7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQodGhpcy5lbWJlZGRlZCk7Ci0JCX0KLQkJaWYgKCF0aGlzLmVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmlzRW1wdHkoKSkgewotCQkJaWYgKHRoaXMubGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQlJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJCQl0aGlzLmxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKHRydWUpOwotCQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKCgoSUF0dHJpYnV0ZU92ZXJyaWRlKSgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5saXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0Q29sdW1uKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKGZhbHNlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRvUG9wdWxhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbWJlZGRlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVtYmVkZGVkLmVBZGFwdGVycygpLmFkZCh0aGlzLmVtYmVkZGVkTGlzdGVuZXIpOwotCQkJZm9yIChJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiB0aGlzLmVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVMaXN0ZW5lcik7Ci0JCQl9CQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW1iZWRkZWQgIT0gbnVsbCkgewotCQkJdGhpcy5lbWJlZGRlZC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5lbWJlZGRlZExpc3RlbmVyKTsKLQkJCWZvciAoSUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogdGhpcy5lbWJlZGRlZC5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlTGlzdGVuZXIpOwotCQkJfQkKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGVtYmVkZGVkQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW1iZWRkZWQuY2xhc3MpKSB7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUVNQkVEREVEX19TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFUyA6Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUVNQkVEREVEX19ERUZBVUxUX0FUVFJJQlVURV9PVkVSUklERVMgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChsaXN0Vmlld2VyLmdldExpc3QoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlsaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCWNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKCFsaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0JCQkJCQlpZiAobGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJCQljb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCQkJKChJQXR0cmlidXRlT3ZlcnJpZGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5hdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyKTsKLQkJCQkJZmluYWwgT2JqZWN0IG5ld1ZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCWxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSB7Ci0JCQkJCUxpc3QgYWRkZWRMaXN0ID0gKExpc3QpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yPElBdHRyaWJ1dGVPdmVycmlkZT4gaSA9IGFkZGVkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlJQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUgPSBpLm5leHQoKTsKLQkJCQkJCW92ZXJyaWRlLmVBZGFwdGVycygpLmFkZCh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7Ci0JCQkJCSgoSUF0dHJpYnV0ZU92ZXJyaWRlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVMaXN0ZW5lcik7CQkJCQotCQkJCX0KLQkJCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJCUxpc3QgcmVtb3ZlZExpc3QgPSAoTGlzdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3I8SUF0dHJpYnV0ZU92ZXJyaWRlPiBpID0gcmVtb3ZlZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCQkJSUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlID0gaS5uZXh0KCk7Ci0JCQkJCQlvdmVycmlkZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5hdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXR0cmlidXRlT3ZlcnJpZGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQVRUUklCVVRFX09WRVJSSURFX19OQU1FIDoKLQkJCQlmaW5hbCBJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSAoSUF0dHJpYnV0ZU92ZXJyaWRlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0Vmlld2VyLnJlZnJlc2goYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGE5YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZENvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJRW1iZWRkZWQgZW1iZWRkZWQ7Ci0JCi0JcHJpdmF0ZSBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSBhdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGU7Ci0KLQlwdWJsaWMgRW1iZWRkZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhOwotCQkKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgPSBuZXcgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5lbWJlZGRlZCA9IChJRW1iZWRkZWQpIG9iajsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUucG9wdWxhdGUob2JqKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRJZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZElkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTExMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZElkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZENvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHVibGljIEVtYmVkZGVkSWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGYzYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlN0cmluZ1dpdGhEZWZhdWx0Q2hvb3Nlci5TdHJpbmdIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JCi0JcHJpdmF0ZSBFbnRpdHlOYW1lQ29tYm8gZW50aXR5TmFtZUNvbWJvOwotCQotCXByaXZhdGUgVGFibGVDb21wb3NpdGUgdGFibGVDb21wb3NpdGU7Ci0JcHJpdmF0ZSBJbmhlcml0YW5jZUNvbXBvc2l0ZSBpbmhlcml0YW5jZUNvbXBvc2l0ZTsKLQlwcml2YXRlIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSBzZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7Ci0JcHJpdmF0ZSBPdmVycmlkZXNDb21wb3NpdGUgYXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlOwotCQotCXB1YmxpYyBFbnRpdHlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlDb250cm9sIGdlbmVyYWxDb250cm9sID0gYnVpbGRHZW5lcmFsQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2VuZXJhbENvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29udHJvbCBhdHRyaWJ1dGVPdmVycmlkZXNDb250cm9sID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlhdHRyaWJ1dGVPdmVycmlkZXNDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbnRyb2wgc2Vjb25kYXJ5VGFibGVzQ29udHJvbCA9IGJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc2Vjb25kYXJ5VGFibGVzQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbnRyb2wgaW5oZXJpdGFuY2VDb250cm9sID0gYnVpbGRJbmhlcml0YW5jZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWluaGVyaXRhbmNlQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkR2VuZXJhbENvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0JCQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRFbnRpdHlOYW1lTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMuZW50aXR5TmFtZUNvbWJvID0gCi0JICAgIAlDb21tb25XaWRnZXRzLmJ1aWxkRW50aXR5TmFtZUNvbWJvKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZW50aXR5TmFtZUNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChlbnRpdHlOYW1lQ29tYm8uZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9OQU1FKTsKLQkJCi0JCQotCQl0aGlzLnRhYmxlQ29tcG9zaXRlID0gbmV3IFRhYmxlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy50YWJsZUNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlyZXR1cm4gZ2VuZXJhbENvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24oY29tcG9zaXRlLCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLQkgICAgc2VjdGlvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfc2Vjb25kYXJ5VGFibGVzKTsKLQotCQlDb21wb3NpdGUgY2xpZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY2xpZW50KTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuc2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlID0gbmV3IFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShjbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRJbmhlcml0YW5jZUNvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0JICAgIHNlY3Rpb24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlKTsKLQotCQlDb21wb3NpdGUgaW5oZXJpdGFuY2VDbGllbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChpbmhlcml0YW5jZUNsaWVudCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWluaGVyaXRhbmNlQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuaW5oZXJpdGFuY2VDb21wb3NpdGUgPSBuZXcgSW5oZXJpdGFuY2VDb21wb3NpdGUoaW5oZXJpdGFuY2VDbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmluaGVyaXRhbmNlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0JICAgIHNlY3Rpb24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JICAgIC8vc2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsgLy9ub3QgZ29pbmcgdG8gZXhwYW5kIHRoaXMgZm9yIG5vdywgaXQgY2F1c2VzIHRoZSBzY3JvbGwgYmFyIG5vdCB0byBhcHBlYXIKLQkJQ29tcG9zaXRlIGNsaWVudCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNsaWVudCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSA9IG5ldyBPdmVycmlkZXNDb21wb3NpdGUoY2xpZW50LCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLy9UT0RPIHRhbGsgdG8gSmF2YUVkaXRvciBwZW9wbGUgYWJvdXQgd2hhdCB3ZSBjYW4gZG8gdG8gaG9vayBpbiBUYWJiZWRQcm9wZXJ0aWVzIGZvciB0aGUgSmF2YUVkaXRvcgotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5lbnRpdHkgPSAoSUVudGl0eSkgb2JqOwotCQl0aGlzLmVudGl0eU5hbWVDb21iby5wb3B1bGF0ZShvYmopOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5wb3B1bGF0ZShvYmopOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5wb3B1bGF0ZShvYmopOwotCQl0aGlzLmluaGVyaXRhbmNlQ29tcG9zaXRlLnBvcHVsYXRlKG9iaik7Ci0JCWlmICh0aGlzLmVudGl0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuZW50aXR5LmdldFRhYmxlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy50YWJsZUNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsJCQkJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMuZW50aXR5TmFtZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMudGFibGVDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5pbmhlcml0YW5jZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5lbnRpdHlOYW1lQ29tYm8uZGlzcG9zZSgpOwotCQl0aGlzLnRhYmxlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMuaW5oZXJpdGFuY2VDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRW50aXR5IGdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5OwotCX0KLQkKLQkKLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIFRhYmxlSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQlwcml2YXRlIElUYWJsZSB0YWJsZTsKLQkJCi0JCVRhYmxlSG9sZGVyKElUYWJsZSB0YWJsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJVGFibGUuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVmYXVsdCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJVGFibGUgZ2V0VGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YWJsZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlTmFtZUhvbGRlciBleHRlbmRzIFRhYmxlSG9sZGVyIGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJCi0JCVRhYmxlTmFtZUhvbGRlcihJVGFibGUgdGFibGUpIHsKLQkJCXN1cGVyKHRhYmxlKTsKLQkJfQotCQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfTkFNRTsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX05BTUU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEl0ZW0oKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSBnZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQlpZiAoZGVmYXVsdE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdCwgZGVmYXVsdE5hbWUpOwotCQkJfQotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld05hbWUpIHsKLQkJCWdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShuZXdOYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlQ2F0YWxvZ0hvbGRlciBleHRlbmRzIFRhYmxlSG9sZGVyIGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJCi0JCVRhYmxlQ2F0YWxvZ0hvbGRlcihJVGFibGUgdGFibGUpIHsKLQkJCXN1cGVyKHRhYmxlKTsKLQkJfQotCQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfQ0FUQUxPRzsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX0NBVEFMT0c7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEl0ZW0oKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdENhdGFsb2cgPSBnZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQlpZiAoZGVmYXVsdENhdGFsb2cgIT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdCwgZGVmYXVsdENhdGFsb2cpOwotCQkJfQotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld05hbWUpIHsKLQkJCWdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhuZXdOYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlU2NoZW1hSG9sZGVyIGV4dGVuZHMgVGFibGVIb2xkZXIgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQkKLQkJVGFibGVTY2hlbWFIb2xkZXIoSVRhYmxlIHRhYmxlKSB7Ci0JCQlzdXBlcih0YWJsZSk7Ci0JCX0KLQkJCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fU1BFQ0lGSUVEX1NDSEVNQTsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX1NDSEVNQTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0SXRlbSgpIHsKLQkJCVN0cmluZyBkZWZhdWx0U2NoZW1hID0gZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQlpZiAoZGVmYXVsdFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfdGFibGVEZWZhdWx0LCBkZWZhdWx0U2NoZW1hKTsKLQkJCX0KLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3RhYmxlTm9EZWZhdWx0U3BlY2lmaWVkOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJCXJldHVybiBnZXRUYWJsZSgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld05hbWUpIHsKLQkJCWdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG5ld05hbWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlOYW1lQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlMGZmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8vIFRPRE8gZ2V0IERlZmF1bHQgdXBkYXRpbmcgYXBwcm9wcmlhdGVseSBiYXNlZCBvbiBFbnRpdHkgbmFtZSBkZWZhdWx0Ci0JCi1wdWJsaWMgY2xhc3MgRW50aXR5TmFtZUNvbWJvIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIElFbnRpdHkgZW50aXR5OwotCXByaXZhdGUgQWRhcHRlciBlbnRpdHlMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQkKLQkKLQlwdWJsaWMgRW50aXR5TmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZEVudGl0eUxpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZEVudGl0eUxpc3RlbmVyKCkgewotCQllbnRpdHlMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWVudGl0eUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQljb21ib01vZGlmaWVkKGUpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tYm9Nb2RpZmllZChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgdGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0LmVxdWFscyhjb21iby5nZXRJdGVtKDApKSkgewotCQkJdGV4dCA9IG51bGw7Ci0JCX0KLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWROYW1lKHRleHQpOwotCQkKLQkJLy8gVE9ETyBEb2VzIHRoaXMgbmVlZCB0byBiZSBkb25lPwotCQkvL3RoaXMuZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKFNldENvbW1hbmQuY3JlYXRlKHRoaXMuZWRpdGluZ0RvbWFpbiwgdGhpcy5lbnRpdHksIE1hcHBpbmdzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1NwZWNpZmllZE5hbWUoKSwgdGV4dCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW50aXR5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSkgewotCQkJY2FzZSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX1NQRUNJRklFRF9OQU1FIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19ERUZBVUxUX05BTUUgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0JCQllbnRpdHkuZUFkYXB0ZXJzKCkuYWRkKGVudGl0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJZW50aXR5LmVBZGFwdGVycygpLnJlbW92ZShlbnRpdHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQllbnRpdHkgPSAoSUVudGl0eSkgb2JqOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCWlmIChlbnRpdHkgPT0gbnVsbCkgewotCQkJY29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7fSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyBkZWZhdWx0SXRlbSA9IE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdFdpdGhPbmVQYXJhbSwgZW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQlTdHJpbmcgc3BlY2lmaWVkTmFtZSA9IGVudGl0eS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQotCQlpZiAoc3BlY2lmaWVkTmFtZSA9PSBudWxsKSB7Ci0JCQlzZXRDb21ib0RhdGEoZGVmYXVsdEl0ZW0sIG5ldyBTdHJpbmdbXSB7ZGVmYXVsdEl0ZW19KTsKLQkJfQotCQllbHNlIHsKLQkJCXNldENvbWJvRGF0YShzcGVjaWZpZWROYW1lLCBuZXcgU3RyaW5nW10ge2RlZmF1bHRJdGVtfSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbWJvRGF0YShTdHJpbmcgdGV4dCwgU3RyaW5nW10gaXRlbXMpIHsKLQkJaWYgKCEgQXJyYXlzLmVxdWFscyhpdGVtcywgY29tYm8uZ2V0SXRlbXMoKSkpIHsKLQkJCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCQkKLQkJaWYgKCEgdGV4dC5lcXVhbHMoY29tYm8uZ2V0VGV4dCgpKSkgewotCQkJY29tYm8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ0NvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBnZXRDb21ibygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW51bUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudW1Db21ib1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Y2YjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW51bUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFbnVtQ29tYm9WaWV3ZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgRW51bUhvbGRlciBlbnVtSG9sZGVyOwotCXByaXZhdGUgQWRhcHRlciBlbnVtTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQotCXB1YmxpYyBFbnVtQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZW51bUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJbW9kZWxDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQl0aGlzLmNvbWJvVmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlFbnVtQ29tYm9WaWV3ZXIudGhpcy5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByb3RlY3RlZCBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50ID09IGVudW1Ib2xkZXIuZGVmYXVsdFZhbHVlKCkpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdCwgZW51bUhvbGRlci5kZWZhdWx0U3RyaW5nKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmICggISB0aGlzLmVudW1Ib2xkZXIuZ2V0KCkuZXF1YWxzKHNlbGVjdGlvbikpIHsKLQkJCQl0aGlzLmVudW1Ib2xkZXIuc2V0KHNlbGVjdGlvbik7Ci0vLwkJCQl0aGlzLmVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSgKLS8vCQkJCQlTZXRDb21tYW5kLmNyZWF0ZSgKLS8vCQkJCQkJdGhpcy5lZGl0aW5nRG9tYWluLAotLy8JCQkJCQl0aGlzLmJhc2ljTWFwcGluZywKLS8vCQkJCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzaWNNYXBwaW5nX09wdGlvbmFsKCksCi0vLwkJCQkJCW9wdGlvbmFsCi0vLwkJCQkJKQotLy8JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtb2RlbENoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRCh0aGlzLmVudW1Ib2xkZXIuZmVhdHVyZUNsYXNzKCkpID09IAotCQkJCXRoaXMuZW51bUhvbGRlci5mZWF0dXJlSWQoKSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW51bUhvbGRlciAhPSBudWxsICYmIHRoaXMuZW51bUhvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnVtSG9sZGVyLndyYXBwZWRPYmplY3QoKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5lbnVtTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW51bUhvbGRlciAhPSBudWxsICYmIHRoaXMuZW51bUhvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnVtSG9sZGVyLndyYXBwZWRPYmplY3QoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5lbnVtTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHBvcHVsYXRlKEVudW1Ib2xkZXIgZW51bUhvbGRlcikgewotCQlzdXBlci5wb3B1bGF0ZShlbnVtSG9sZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmVudW1Ib2xkZXIgPSAoRW51bUhvbGRlcikgb2JqOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5yZW1vdmVBbGwoKTsKLQkJaWYgKHRoaXMuZW51bUhvbGRlci53cmFwcGVkT2JqZWN0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLmNvbWJvVmlld2VyLmFkZCh0aGlzLmVudW1Ib2xkZXIuZW51bVZhbHVlcygpKTsKLQkJCi0JCU9iamVjdCBtb2RlbFNldHRpbmcgPSB0aGlzLmVudW1Ib2xkZXIuZ2V0KCk7Ci0JCQotCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbW9kZWxTZXR0aW5nKSB7Ci0JCQl0aGlzLmNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbFNldHRpbmcpKTsKLQkJfQotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEFuIGludGVyZmFjZSB0byB3cmFwIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIGFjY2Vzc1R5cGUKLQkgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIG11c3QgYmUgcGFzc2VkIGluIHRvIHBvcHVsYXRlKEVPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRW51bUhvbGRlciBleHRlbmRzIEVPYmplY3QgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBudW0gc2V0dGluZyBmcm9tIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlPYmplY3QgZ2V0KCk7Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBlbnVtIHNldHRpbmcgb24gdGhlIHdyYXBwZWQgb2JqZWN0Ci0JCSAqIEBwYXJhbSBmZXRjaAotCQkgKi8KLQkJdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIENsYXNzIG9mIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlDbGFzcyBmZWF0dXJlQ2xhc3MoKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGZlYXR1cmUgaWQgb2YgZW51bSBzZXR0aW5nIG9uIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlpbnQgZmVhdHVyZUlkKCk7Ci0JCQotCQkvKioKLQkJICogVGhlIHdyYXBwZWQgRU9iamVjdCB0aGF0IHRoZSBlbnVtIHNldHRpbmcgaXMgc3RvcmVkIG9uCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCUVPYmplY3Qgd3JhcHBlZE9iamVjdCgpOwotCQkKLQkJT2JqZWN0W10gZW51bVZhbHVlcygpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgRGVmYXVsdCBFbnVtZXJhdG9yIG9iamVjdAotCQkgKi8KLQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSgpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgU3RyaW5nIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlcgotCQkgKiBEZWFmdWx0IChbZGVmYXVsdFN0cmluZygpXSkKLQkJICovCi0JCVN0cmluZyBkZWZhdWx0U3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk5ODkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUlkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLklHZW5lcmF0b3JSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLk51bGxHZW5lcmF0b3JSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgSUlkIGlkOwotCXByaXZhdGUgSUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlOwotCXByaXZhdGUgQWRhcHRlciBnZW5lcmF0ZWRWYWx1ZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgc3RyYXRlZ3lDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgQ0NvbWJvIGdlbmVyYXRvck5hbWVDb21ibzsKLQotCXByb3RlY3RlZCBib29sZWFuIHBvcHVsYXRpbmc7Ci0KLQlwdWJsaWMgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRlZFZhbHVlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkR2VuZXJhdGVkVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWdlbmVyYXRlZFZhbHVlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneSk7Ci0JCQotCQl0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIgPSBidWlsZFN0cmF0ZWd5Q29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMuc3RyYXRlZ3lDb21ib1ZpZXdlci5nZXRDb21ibygpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19HRU5FUkFURURfVkFMVUVfU1RSQVRFR1kpOwotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWUpOwotCQkKLQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8gPSBidWlsZEdlbmVyYXRvck5hbWVDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9HRU5FUkFUT1JfTkFNRSk7Ci0JCQotCQkvLyBUT0RPCi0JCS8vIGJ1aWxkR2VuZXJhdG9yTmFtZVNlbGVjdGlvbkJ1dHRvbiggdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgYnVpbGRTdHJhdGVneUNvbWJvVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQlDQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkU3RyYXRlZ3lMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuYWRkKEdlbmVyYXRpb25UeXBlLlZBTFVFUy50b0FycmF5KCkpOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAocG9wdWxhdGluZykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCUdlbmVyYXRpb25UeXBlIHNlbGVjdGVkVHlwZSA9IChHZW5lcmF0aW9uVHlwZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJY3JlYXRlR2VuZXJhdGVkVmFsdWUoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkuZXF1YWxzKHNlbGVjdGVkVHlwZSkpIHsKLQkJCQkJCWdlbmVyYXRlZFZhbHVlLnNldFN0cmF0ZWd5KHNlbGVjdGVkVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZFN0cmF0ZWd5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBHZW5lcmF0aW9uVHlwZS5ERUZBVUxUKSB7Ci0JCQkJCS8vVE9ETyBuZWVkIHRvIG1vdmUgdGhpcyB0byB0aGUgbW9kZWwsIGRvbid0IHdhbnQgaGFyZGNvZGVkIFN0cmluZwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2RlZmF1bHQsICJBdXRvIik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQotCXByb3RlY3RlZCBDQ29tYm8gYnVpbGRHZW5lcmF0b3JOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBnZW5lcmF0b3JOYW1lID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQkKLQkJCQlpZiAoZ2VuZXJhdG9yTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpID09IG51bGwgfHwgZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkuZXF1YWxzKCIiKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWdlbmVyYXRvck5hbWUgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgewotCQkJCQljcmVhdGVHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJCX0KLQkJCQlnZW5lcmF0ZWRWYWx1ZS5zZXRHZW5lcmF0b3IoZ2VuZXJhdG9yTmFtZSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlZFZhbHVlKCkgewotCQl0aGlzLmdlbmVyYXRlZFZhbHVlID0gdGhpcy5pZC5jcmVhdGVHZW5lcmF0ZWRWYWx1ZSgpOwotCQl0aGlzLmlkLnNldEdlbmVyYXRlZFZhbHVlKHRoaXMuZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlZFZhbHVlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElHZW5lcmF0ZWRWYWx1ZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGVkU3RyYXRlZ3koKSAhPSBnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKSB7Ci0JCQkJCQlzdHJhdGVneUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElHZW5lcmF0ZWRWYWx1ZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1IpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlR2VuZXJhdG9yTmFtZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmlkID0gKElJZCkgb2JqOwotCQlpZiAodGhpcy5pZCA9PSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlZFZhbHVlPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IHRoaXMuaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQkJfQotCQlpZiAodGhpcy5nZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRUZXh0KCIiKTsKLQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldFRleHQoIiIpOwotCQkJdGhpcy5wb3B1bGF0aW5nID0gZmFsc2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcG9wdWxhdGVTdHJhdGVneUNvbWJvKCk7Ci0JCXBvcHVsYXRlR2VuZXJhdG9yTmFtZUNvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5nZW5lcmF0ZWRWYWx1ZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5nZW5lcmF0ZWRWYWx1ZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUdlbmVyYXRvclJlcG9zaXRvcnkgZ2V0R2VuZXJhdG9yUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIE51bGxHZW5lcmF0b3JSZXBvc2l0b3J5Lmluc3RhbmNlKCk7IC8vdGhpcy5pZC5nZXRKcGFQcm9qZWN0KCkuZ2V0UGxhdGZvcm0oKS5nZW5lcmF0b3JSZXBvc2l0b3J5KHRoaXMuaWQudHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yTmFtZUNvbWJvKCkgewotCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGkgPSBnZXRHZW5lcmF0b3JSZXBvc2l0b3J5KCkuZ2VuZXJhdG9yTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICl7Ci0JCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5hZGQoaS5uZXh0KCkpOwotCQl9Ci0KLQkJcG9wdWxhdGVHZW5lcmF0b3JOYW1lKCk7Ci0JfQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUdlbmVyYXRvck5hbWUoKSB7Ci0JCVN0cmluZyBnZW5lcmF0b3JOYW1lID0gdGhpcy5nZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvck5hbWUgPT0gbnVsbCB8fCBnZW5lcmF0b3JOYW1lLmVxdWFscygiIikpIHsKLQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldFRleHQoIiIpOwotCQl9Ci0JCWVsc2UgaWYgKCF0aGlzLmdlbmVyYXRvck5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKGdlbmVyYXRvck5hbWUpKSB7Ci0JCQl0aGlzLmdlbmVyYXRvck5hbWVDb21iby5zZXRUZXh0KGdlbmVyYXRvck5hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVN0cmF0ZWd5Q29tYm8oKSB7Ci0JCUdlbmVyYXRpb25UeXBlIHNlbGVjdGVkVHlwZSA9IHNlbGVjdGVkU3RyYXRlZ3koKTsKLQkJR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3kgPSB0aGlzLmdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCk7Ci0JCWlmIChzdHJhdGVneSA9PSBHZW5lcmF0aW9uVHlwZS5BVVRPKSB7Ci0JCQlpZiAoc2VsZWN0ZWRUeXBlICE9IEdlbmVyYXRpb25UeXBlLkFVVE8pIHsKLQkJCQl0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEdlbmVyYXRpb25UeXBlLkFVVE8pKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHJhdGVneSA9PSBHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSkgewotCQkJaWYgKHNlbGVjdGVkVHlwZSAhPSBHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSkgewotCQkJCXRoaXMuc3RyYXRlZ3lDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHJhdGVneSA9PSBHZW5lcmF0aW9uVHlwZS5JREVOVElUWSkgewotCQkJaWYgKHNlbGVjdGVkVHlwZSAhPSBHZW5lcmF0aW9uVHlwZS5JREVOVElUWSkgewotCQkJCXRoaXMuc3RyYXRlZ3lDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHJhdGVneSA9PSBHZW5lcmF0aW9uVHlwZS5UQUJMRSkgewotCQkJaWYgKHNlbGVjdGVkVHlwZSAhPSBHZW5lcmF0aW9uVHlwZS5UQUJMRSkgewotCQkJCXRoaXMuc3RyYXRlZ3lDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oR2VuZXJhdGlvblR5cGUuVEFCTEUpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChzZWxlY3RlZFR5cGUgIT0gR2VuZXJhdGlvblR5cGUuREVGQVVMVCkgewotCQkJCXRoaXMuc3RyYXRlZ3lDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oR2VuZXJhdGlvblR5cGUuREVGQVVMVCkpOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gZmlyc3QgaW5pdGlhbGl6YXRpb24KLQl9Ci0KLQlwcml2YXRlIEdlbmVyYXRpb25UeXBlIHNlbGVjdGVkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiAoR2VuZXJhdGlvblR5cGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5zdHJhdGVneUNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0b3JDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmMDIyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIEdlbmVyYXRvckNvbXBvc2l0ZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhdG9yQ29tcG9zaXRlPEUgZXh0ZW5kcyBJR2VuZXJhdG9yPiBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQlwcml2YXRlIElJZCBpZDsKLQlwcml2YXRlIEUgZ2VuZXJhdG9yOwotCXByaXZhdGUgQWRhcHRlciBnZW5lcmF0b3JMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBUZXh0IG5hbWVUZXh0V2lkZ2V0OwotCi0JcHVibGljIEdlbmVyYXRvckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuZ2VuZXJhdG9yTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRvckxpc3RuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkR2VuZXJhdG9yTGlzdG5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWdlbmVyYXRvckNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIEdlbmVyYXRvciBzcGVjaWZpZWROYW1lIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBUZXh0IGJ1aWxkTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBUZXh0IHRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChwYXJlbnQsIG51bGwpOwotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIG5hbWUgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGdldEdlbmVyYXRvcigpLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJbmFtZSA9IG51bGw7Ci0JCQkJfQotCQkJCUlHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZ2V0R2VuZXJhdG9yKCk7Ci0JCQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQkJCWdlbmVyYXRvciA9IGNyZWF0ZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCQlnZW5lcmF0b3Iuc2V0TmFtZShuYW1lKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFIGNyZWF0ZUdlbmVyYXRvcigpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmlkID0gKElJZCkgb2JqOwotCQlpZiAodGhpcy5pZCAgPT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0b3IgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yKHRoaXMuaWQpOwotCQlpZiAodGhpcy5nZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlwb3B1bGF0ZU5hbWVWaWV3ZXIoKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlTmFtZVZpZXdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRvci5lQWRhcHRlcnMoKS5hZGQodGhpcy5nZW5lcmF0b3JMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRvci5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5nZW5lcmF0b3JMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRSBnZW5lcmF0b3IoSUlkIGlkKTsKLQkKLQlwcm90ZWN0ZWQgSUlkIGlkTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdG9yQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElHZW5lcmF0b3IuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUdFTkVSQVRPUl9fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKG5hbWVUZXh0V2lkZ2V0LmdldFRleHQoKSA9PSBudWxsIHx8ICFuYW1lVGV4dFdpZGdldC5nZXRUZXh0KCkuZXF1YWxzKGdldEdlbmVyYXRvcigpLmdldE5hbWUoKSkpIHsKLQkJCQkJCWlmIChnZXRHZW5lcmF0b3IoKS5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCQkJCWNsZWFyTmFtZVZpZXdlcigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbmFtZVRleHRXaWRnZXQuc2V0VGV4dChnZXRHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVOYW1lVmlld2VyKCkgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0R2VuZXJhdG9yKCkuZ2V0TmFtZSgpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMubmFtZVRleHRXaWRnZXQuZ2V0VGV4dCgpLmVxdWFscyhuYW1lKSkgewotCQkJCXRoaXMubmFtZVRleHRXaWRnZXQuc2V0VGV4dChuYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY2xlYXJOYW1lVmlld2VyKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRSBnZXRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5jbGVhck5hbWVWaWV3ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhck5hbWVWaWV3ZXIoKSB7Ci0JCXRoaXMubmFtZVRleHRXaWRnZXQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0lkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0lkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MWQ0Y2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9JZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVudW1Db21ib1ZpZXdlci5FbnVtSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSWRDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXByaXZhdGUgSUlkIGlkOwotCXByaXZhdGUgQWRhcHRlciBpZExpc3RlbmVyOwotCQotCXByaXZhdGUgQ29sdW1uQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgRW51bUNvbWJvVmlld2VyIHRlbXBvcmFsVHlwZVZpZXdlcjsKLQkKLQlwcml2YXRlIFNlY3Rpb24gcGtHZW5lcmF0aW9uU2VjdGlvbjsKLQlwcml2YXRlIEJ1dHRvbiBwcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94OwotCXByaXZhdGUgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBTZWN0aW9uIHRhYmxlR2VuU2VjdGlvbjsKLQlwcml2YXRlIEJ1dHRvbiB0YWJsZUdlbmVyYXRvckNoZWNrQm94OwotCXByaXZhdGUgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUgdGFibGVHZW5lcmF0b3JDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBTZWN0aW9uIHNlcXVlbmNlR2VuU2VjdGlvbjsKLQlwcml2YXRlIEJ1dHRvbiBzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94OwotCXByaXZhdGUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgc2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGU7Ci0KLQkKLQlwdWJsaWMgSWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmlkTGlzdGVuZXIgPSBidWlsZElkTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkSWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWlkTWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0Jdm9pZCBpZE1hcHBpbmdDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElJZC5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JSURfX1RBQkxFX0dFTkVSQVRPUiA6Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlJZENvbXBvc2l0ZS50aGlzLnBvcHVsYXRlVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklJRF9fU0VRVUVOQ0VfR0VORVJBVE9SIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUlkQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUlEX19HRU5FUkFURURfVkFMVUUgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJSWRDb21wb3NpdGUudGhpcy5wb3B1bGF0ZUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlDb250cm9sIGdlbmVyYWxDb250cm9sID0gYnVpbGRHZW5lcmFsQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2VuZXJhbENvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29udHJvbCBnZW5lcmF0aW9uQ29udHJvbCA9IGJ1aWxkR2VuZXJhdGlvbkNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdlbmVyYXRpb25Db250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQkJCi0JCXRoaXMuY29sdW1uQ29tcG9zaXRlID0gbmV3IENvbHVtbkNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsJCi0KLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFRlbXBvcmFsTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRW51bUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZW1wb3JhbFR5cGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19URU1QT1JBTCk7Ci0KLQkJcmV0dXJuIGdlbmVyYWxDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkR2VuZXJhdGlvbkNvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCXRoaXMucGtHZW5lcmF0aW9uU2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0JICAgIHRoaXMucGtHZW5lcmF0aW9uU2VjdGlvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb24pOwotCi0JCUNvbXBvc2l0ZSBnZW5lcmF0aW9uQ2xpZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZSh0aGlzLnBrR2VuZXJhdGlvblNlY3Rpb24pOwotCQl0aGlzLnBrR2VuZXJhdGlvblNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYXRpb25DbGllbnQpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlnZW5lcmF0aW9uQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMucHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveCA9IGJ1aWxkUHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveChnZW5lcmF0aW9uQ2xpZW50KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJdGhpcy5wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAocHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveCwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfUFJJTUFSWV9LRVlfR0VORVJBVElPTik7Ci0JCQotCQl0aGlzLmdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlID0gbmV3IEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKGdlbmVyYXRpb25DbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCSAgICB0aGlzLnRhYmxlR2VuU2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGdlbmVyYXRpb25DbGllbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnRhYmxlR2VuU2VjdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JICAgIHRoaXMudGFibGVHZW5TZWN0aW9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvcik7Ci0KLQkJQ29tcG9zaXRlIHRhYmxlR2VuQ2xpZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZSh0aGlzLnRhYmxlR2VuU2VjdGlvbik7Ci0JCXRoaXMudGFibGVHZW5TZWN0aW9uLnNldENsaWVudCh0YWJsZUdlbkNsaWVudCk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl0YWJsZUdlbkNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCXRoaXMudGFibGVHZW5lcmF0b3JDaGVja0JveCA9IGJ1aWxkVGFibGVHZW5lcmF0b3JDaGVja0JveCh0YWJsZUdlbkNsaWVudCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDaGVja0JveC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3gsIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQl0aGlzLnRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlID0gbmV3IFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKHRhYmxlR2VuQ2xpZW50LCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQotCQkKLQkgICAgdGhpcy5zZXF1ZW5jZUdlblNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihnZW5lcmF0aW9uQ2xpZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSk7Ci0JICAgIHRoaXMuc2VxdWVuY2VHZW5TZWN0aW9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5zZXF1ZW5jZUdlblNlY3Rpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29tcG9zaXRlIHNlcXVlbmNlR2VuQ2xpZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZSh0aGlzLnNlcXVlbmNlR2VuU2VjdGlvbik7Ci0JCXRoaXMuc2VxdWVuY2VHZW5TZWN0aW9uLnNldENsaWVudChzZXF1ZW5jZUdlbkNsaWVudCk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzZXF1ZW5jZUdlbkNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94ID0gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94KHNlcXVlbmNlR2VuQ2xpZW50KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlID0gbmV3IFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKHNlcXVlbmNlR2VuQ2xpZW50LCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXJldHVybiB0aGlzLnBrR2VuZXJhdGlvblNlY3Rpb247Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkUHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKHBhcmVudCxKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSWRDb21wb3NpdGUudGhpcy5wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94Q2xpY2tlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0Jdm9pZCBwcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94Q2xpY2tlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWJvb2xlYW4gbWFwcGluZ0hhc0dlbmVyYXRlZFZhbHVlID0gdGhpcy5pZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGw7Ci0JCWJvb2xlYW4gY2hlY2tlZCA9IHRoaXMucHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGNoZWNrZWQgPT0gbWFwcGluZ0hhc0dlbmVyYXRlZFZhbHVlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gbnVsbDsKLQkJaWYgKGNoZWNrZWQpIHsKLQkJCWdlbmVyYXRlZFZhbHVlID0gdGhpcy5pZC5jcmVhdGVHZW5lcmF0ZWRWYWx1ZSgpOwotCQl9Ci0JCXRoaXMuaWQuc2V0R2VuZXJhdGVkVmFsdWUoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkVGFibGVHZW5lcmF0b3JDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKHBhcmVudCxKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSWRDb21wb3NpdGUudGhpcy50YWJsZUdlbmVyYXRvckNoZWNrQm94Q2xpY2tlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0Jdm9pZCB0YWJsZUdlbmVyYXRvckNoZWNrQm94Q2xpY2tlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWJvb2xlYW4gbWFwcGluZ0hhc1RhYmxlR2VuZXJhdG9yID0gdGhpcy5pZC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGw7Ci0JCWJvb2xlYW4gY2hlY2tlZCA9IHRoaXMudGFibGVHZW5lcmF0b3JDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGNoZWNrZWQgPT0gbWFwcGluZ0hhc1RhYmxlR2VuZXJhdG9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gbnVsbDsKLQkJaWYgKGNoZWNrZWQpIHsKLQkJCXRhYmxlR2VuZXJhdG9yID0gdGhpcy5pZC5jcmVhdGVUYWJsZUdlbmVyYXRvcigpOwotCQl9Ci0JCXRoaXMuaWQuc2V0VGFibGVHZW5lcmF0b3IodGFibGVHZW5lcmF0b3IpOwotCQlpZiAoY2hlY2tlZCkgewotCQkJSUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gdGhpcy5pZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJaWYgKGdlbmVyYXRlZFZhbHVlICE9IG51bGwgJiYgZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24ocGFyZW50LEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3IsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJZENvbXBvc2l0ZS50aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3hDbGlja2VkKGUpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQl2b2lkIHNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3hDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBtYXBwaW5nSGFzU2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLmlkLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbDsKLQkJYm9vbGVhbiBjaGVja2VkID0gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlpZiAoY2hlY2tlZCA9PSBtYXBwaW5nSGFzU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBudWxsOwotCQlpZiAoY2hlY2tlZCkgewotCQkJc2VxdWVuY2VHZW5lcmF0b3IgPSB0aGlzLmlkLmNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCX0KLQkJdGhpcy5pZC5zZXRTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCWlmIChjaGVja2VkKSB7Ci0JCQlJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmlkLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQlpZiAoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCAmJiBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZShnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuaWQgPSAoSUlkKSBvYmo7Ci0JCWlmICh0aGlzLmlkICE9IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuaWQuZ2V0Q29sdW1uKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy50YWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkgICAgdGhpcy5wa0dlbmVyYXRpb25TZWN0aW9uLnNldEV4cGFuZGVkKHRydWUpOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlci5wb3B1bGF0ZShuZXcgVGVtcG9yYWxUeXBlSG9sZGVyKHRoaXMuaWQpKTsKLQkJcG9wdWxhdGVHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZSgpOwotCQlwb3B1bGF0ZVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKCk7Ci0JCXBvcHVsYXRlVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoKSB7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDb21wb3NpdGUucG9wdWxhdGUodGhpcy5pZCk7Ci0JCWJvb2xlYW4gdGFibGVHZW5lcmF0b3JFeGlzdHMgPSB0aGlzLmlkLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbDsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckNoZWNrQm94LnNldFNlbGVjdGlvbih0YWJsZUdlbmVyYXRvckV4aXN0cyk7Ci0JCWlmICh0YWJsZUdlbmVyYXRvckV4aXN0cykgewotCQkJdGhpcy50YWJsZUdlblNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgpIHsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLmlkKTsKLQkJYm9vbGVhbiBzZXF1ZW5jZUdlbmVyYXRvckV4aXN0cyA9IHRoaXMuaWQuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHNlcXVlbmNlR2VuZXJhdG9yRXhpc3RzKTsKLQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yRXhpc3RzKSB7Ci0JCQl0aGlzLnNlcXVlbmNlR2VuU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKCkgewotCQl0aGlzLmdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuaWQpOwotCQl0aGlzLnByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKSAhPSBudWxsKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmlkICE9bnVsbCkgewotCQkJdGhpcy5pZC5lQWRhcHRlcnMoKS5hZGQodGhpcy5pZExpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmlkICE9bnVsbCkgewotCQkJdGhpcy5pZC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5pZExpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUlkIGdldElkKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBUZW1wb3JhbFR5cGVIb2xkZXIgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudW1Ib2xkZXIgewotCQkKLQkJcHJpdmF0ZSBJSWQgaWQ7Ci0JCQotCQlUZW1wb3JhbFR5cGVIb2xkZXIoSUlkIGlkKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldCgpIHsKLQkJCXJldHVybiB0aGlzLmlkLmdldFRlbXBvcmFsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMuaWQuc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSkgZW51bVNldHRpbmcpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElJZC5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JSURfX1RFTVBPUkFMOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuaWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBlbnVtVmFsdWVzKCkgewotCQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogVGVtcG9yYWxUeXBlIGhhcyBubyBEZWZhdWx0LCByZXR1cm4gbnVsbAotCQkgKi8KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFRlbXBvcmFsVHlwZSBoYXMgbm8gRGVmYXVsdCwgcmV0dXJuIG51bGwKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWI2MTU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBJbmhlcml0YW5jZUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgewotCQotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JcHJpdmF0ZSBJRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBlbnRpdHlMaXN0ZW5lcjsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgZGlzY3JpbWluYXRvckNvbHVtbkxpc3RlbmVyOwotCQotCXByaXZhdGUgQ0NvbWJvVmlld2VyIHN0cmF0ZWd5Vmlld2VyOwotCXByaXZhdGUgQ0NvbWJvIGNvbHVtbkNvbWJvOwotCXByaXZhdGUgQ0NvbWJvVmlld2VyIGRpc2NyaW1pbmF0b3JUeXBlVmlld2VyOwotCXByaXZhdGUgQ0NvbWJvIGRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvOwotCQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQkKLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0JCi0JcHJpdmF0ZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUgcGtKb2luQ29sdW1uc0NvbXBvc2l0ZTsKLQkKLQlwdWJsaWMgSW5oZXJpdGFuY2VDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmVudGl0eUxpc3RlbmVyID0gYnVpbGRFbnRpdHlMaXN0ZW5lcigpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5MaXN0ZW5lciA9IGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0JCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEVudGl0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJZW50aXR5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWRpc2NyaW1pbmF0b3JDb2x1bW5DaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotICAgIHByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUluaGVyaXRhbmNlQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJSW5oZXJpdGFuY2VDb21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUluaGVyaXRhbmNlQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZih0YWJsZSA9PSBnZXREYlRhYmxlKCkpIHsKLQkJCQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJSW5oZXJpdGFuY2VDb21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0gICAgfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0KLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0KLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5KTsKLQotCQl0aGlzLnN0cmF0ZWd5Vmlld2VyID0gYnVpbGRTdHJhdGVneUNvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5zdHJhdGVneVZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuc3RyYXRlZ3lWaWV3ZXIuZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9JTkhFUklUQU5DRV9TVFJBVEVHWSk7Ci0KLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY29sdW1uKTsKLQotCQl0aGlzLmNvbHVtbkNvbWJvID0gYnVpbGRDb2x1bW5Db21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuY29sdW1uQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5jb2x1bW5Db21ibywgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVHlwZSk7Ci0KLQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlciA9IGJ1aWxkRGlzY3JpbWluYXRvclR5cGVDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLmdldENvbWJvKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9UWVBFKTsKLQkKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVmFsdWUpOwotCi0JCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8gPSBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXByaXZhdGUgQ0NvbWJvVmlld2VyIGJ1aWxkU3RyYXRlZ3lDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50KTsKLQkJQ0NvbWJvVmlld2VyIHN0cmF0ZWd5Vmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXN0cmF0ZWd5Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoYnVpbGRTdHJhdGVneUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXN0cmF0ZWd5Vmlld2VyLmFkZChJbmhlcml0YW5jZVR5cGUuVkFMVUVTLnRvQXJyYXkoKSk7Ci0JCXN0cmF0ZWd5Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSW5oZXJpdGFuY2VDb21wb3NpdGUudGhpcy5zdHJhdGVneVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiBzdHJhdGVneVZpZXdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRTdHJhdGVneUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gSW5oZXJpdGFuY2VUeXBlLkRFRkFVTFQpIHsKLQkJCQkJLy9UT0RPIG5lZWQgdG8gbW92ZSB0aGlzIHRvIHRoZSBtb2RlbCwgZG9uJ3Qgd2FudCBoYXJkY29kZWQgU3RyaW5nCi0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGVmYXVsdCwgIlNpbmdsZSBUYWJsZSIpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0Jdm9pZCBzdHJhdGVneVNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlID0gKEluaGVyaXRhbmNlVHlwZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmICggISB0aGlzLmVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkuZXF1YWxzKGluaGVyaXRhbmNlVHlwZSkpIHsKLQkJCQl0aGlzLmVudGl0eS5zZXRJbmhlcml0YW5jZVN0cmF0ZWd5KGluaGVyaXRhbmNlVHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDQ29tYm8gYnVpbGRDb2x1bW5Db21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0gIAkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRhYmxlVGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRhYmxlVGV4dC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFibGVUZXh0ID0gbnVsbDsKLQkJCQkJaWYgKGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgfHwgZGlzY3JpbWluYXRvckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHRhYmxlVGV4dCAhPSBudWxsICYmIGNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0YWJsZVRleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXRhYmxlVGV4dCA9IG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgJiYgdGFibGVUZXh0ICE9IG51bGwpIHsKLQkJCQkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKHRhYmxlVGV4dCk7Ci0JCQkJfQotCQkJCWlmIChkaXNjcmltaW5hdG9yQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSAhPSBudWxsICYmICFkaXNjcmltaW5hdG9yQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHModGFibGVUZXh0KSkgewotCQkJCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldFNwZWNpZmllZE5hbWUodGFibGVUZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JCQotCX0KLQkKLQlwcml2YXRlIENDb21ib1ZpZXdlciBidWlsZERpc2NyaW1pbmF0b3JUeXBlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCk7Ci0JCUNDb21ib1ZpZXdlciBkaXNjcmltaW5hdG9yVHlwZVZpZXdlciA9IG5ldyBDQ29tYm9WaWV3ZXIoY29tYm8pOwotCQlkaXNjcmltaW5hdG9yVHlwZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkRGlzY3JpbWluYXRvclR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQlkaXNjcmltaW5hdG9yVHlwZVZpZXdlci5hZGQoRGlzY3JpbWluYXRvclR5cGUuVkFMVUVTLnRvQXJyYXkoKSk7Ci0JCQotCQlkaXNjcmltaW5hdG9yVHlwZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUluaGVyaXRhbmNlQ29tcG9zaXRlLnRoaXMuZGlzY3JpbWluYXRvclR5cGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gZGlzY3JpbWluYXRvclR5cGVWaWV3ZXI7Ci0JfQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkRGlzY3JpbWluYXRvclR5cGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50ID09IERpc2NyaW1pbmF0b3JUeXBlLkRFRkFVTFQpIHsKLQkJCQkJLy9UT0RPIG5lZWQgdG8gbW92ZSB0aGlzIHRvIHRoZSBtb2RlbCwgZG9uJ3Qgd2FudCBoYXJkY29kZWQgU3RyaW5nCi0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlLCAiU3RyaW5nIik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQl2b2lkIGRpc2NyaW1pbmF0b3JUeXBlU2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCURpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlID0gKERpc2NyaW1pbmF0b3JUeXBlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKCAhIHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpLmVxdWFscyhkaXNjcmltaW5hdG9yVHlwZSkpIHsKLQkJCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uc2V0RGlzY3JpbWluYXRvclR5cGUoZGlzY3JpbWluYXRvclR5cGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgQ0NvbWJvIGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgZGlzY3JpbWluYXRvclZhbHVlID0gZW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJCVN0cmluZyB2YWx1ZSA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCWlmIChkaXNjcmltaW5hdG9yVmFsdWUgPT0gbnVsbCB8fCBkaXNjcmltaW5hdG9yVmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIHZhbHVlLmVxdWFscyhjb21iby5nZXRJdGVtKDApKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKGRpc2NyaW1pbmF0b3JWYWx1ZSA9PSBudWxsIHx8ICFkaXNjcmltaW5hdG9yVmFsdWUuZXF1YWxzKHZhbHVlKSkgewotCQkJCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmVudGl0eSA9IChJRW50aXR5KSBvYmo7Ci0JCWlmICh0aGlzLmVudGl0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4gPSB0aGlzLmVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQlwb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQlwb3B1cGxhdGVEaXNjcmltaW5hdG9yVHlwZUNvbWJvVmlld2VyKCk7CQkJCi0JCQlwb3B1bGF0ZVN0cmF0ZWd5Q29tYm9WaWV3ZXIoKTsKLQkJCXBvcHVsYXRlRGlzY3JpbWluYXRvclZhbHVlQ29tYm8oKTsKLQkJCXRoaXMucGtKb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLmVudGl0eSk7CQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uID0gbnVsbDsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCWlmICh0aGlzLmVudGl0eSAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0vLwkJCXBvcHVwbGF0ZVN0cmF0ZWd5Q29tYm9WaWV3ZXIoKTsKLS8vCQkJcG9wdXBsYXRlRGlzY3JpbWluYXRvclZhbHVlQ29tYm8oKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCXRoaXMuZW50aXR5LmVBZGFwdGVycygpLmFkZCh0aGlzLmVudGl0eUxpc3RlbmVyKTsKLQkJCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5lQWRhcHRlcnMoKS5hZGQodGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uTGlzdGVuZXIpOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmVudGl0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLmVudGl0eS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5lbnRpdHlMaXN0ZW5lcik7Ci0JCQl0aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlpZih0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmVudGl0eS5nZXRKcGFQcm9qZWN0KCkuY29ubmVjdGlvblByb2ZpbGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBnZXREYlRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHkucHJpbWFyeURiVGFibGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sdW1uQ29tYm8oKSB7Ci0JCS8vVE9ETyBkb24ndCBkbyBpbnN0YW5jZW9mIGNoZWNrIGhlcmUgLSBjaGVjayBvbiBUYWJsZSwgb3IgaXNSb290IGNoZWNrIG9uIEVudGl0eQotCQkvL3RoaXMudGFibGVDb21iby5zZXRFbmFibGVkKCEodGhpcy50YWJsZSBpbnN0YW5jZW9mIFNpbmdsZVRhYmxlSW5oZXJpdGFuY2VDaGlsZFRhYmxlSW1wbCkpOwotCQlwb3B1bGF0ZURlZmF1bHRDb2x1bW5OYW1lKCk7Ci0KLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbHVtbkNvbWJvLmdldEl0ZW1Db3VudCgpLTEpOwotCQkJVGFibGUgdGFibGUgPSBnZXREYlRhYmxlKCk7Ci0JCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KENvbGxlY3Rpb25Ub29scy5saXN0KHRhYmxlLmNvbHVtbk5hbWVzKCkpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJdGhpcy5jb2x1bW5Db21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29sdW1uQ29tYm8ucmVtb3ZlKDEsIHRoaXMuY29sdW1uQ29tYm8uZ2V0SXRlbUNvdW50KCktMSk7Ci0JCX0KLQkJcG9wdWxhdGVDb2x1bW5OYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCVN0cmluZyBkZWZhdWx0VGFibGVOYW1lID0gZGlzY3JpbWluYXRvckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBjb2x1bW5Db21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQljb2x1bW5Db21iby5zZXRJdGVtKDAsIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdFRhYmxlTmFtZSkpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggPT0gMCkgewotCQkJLy9jb21ibyB0ZXh0IGRvZXMgbm90IHVwZGF0ZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIDIgbWFwcGluZ3Mgb2YgdGhlIHNhbWUgdHlwZQotCQkJLy90aGF0IGJvdGggaGF2ZSBhIGRlZmF1bHQgY29sdW1uIG5hbWUuICBjbGVhciB0aGUgc2VsZWN0aW9uIGFuZCB0aGVuIHNldCBpdCBhZ2FpbgotCQkJY29sdW1uQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJCWNvbHVtbkNvbWJvLnNlbGVjdCgwKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQ29sdW1uTmFtZSgpIHsKLQkJU3RyaW5nIHRhYmxlTmFtZSA9IHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCVN0cmluZyBkZWZhdWx0TmFtZSA9IHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQlpZiAodGFibGVOYW1lICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy5jb2x1bW5Db21iby5nZXRUZXh0KCkuZXF1YWxzKHRhYmxlTmFtZSkpIHsKLQkJCQl0aGlzLmNvbHVtbkNvbWJvLnNldFRleHQodGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICghdGhpcy5jb2x1bW5Db21iby5nZXRUZXh0KCkuZXF1YWxzKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdE5hbWUpKSkgewotCQkJCXRoaXMuY29sdW1uQ29tYm8uc2VsZWN0KDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVwbGF0ZURpc2NyaW1pbmF0b3JUeXBlQ29tYm9WaWV3ZXIoKSB7Ci0JCWlmICh0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSA9PSBEaXNjcmltaW5hdG9yVHlwZS5ERUZBVUxUKSB7Ci0JCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBEaXNjcmltaW5hdG9yVHlwZS5ERUZBVUxUKSB7Ci0JCQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oRGlzY3JpbWluYXRvclR5cGUuREVGQVVMVCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpID09IERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpIHsKLQkJCWlmICgoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpIHsKLQkJCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihEaXNjcmltaW5hdG9yVHlwZS5DSEFSKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkgPT0gRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUikgewotCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUikgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICgoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IERpc2NyaW1pbmF0b3JUeXBlLlNUUklORykgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKERpc2NyaW1pbmF0b3JUeXBlLlNUUklORykpOwotCQkJfQotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3RyYXRlZ3lDb21ib1ZpZXdlcigpIHsKLQkJaWYgKHRoaXMuZW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuREVGQVVMVCkgewotCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5zdHJhdGVneVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gSW5oZXJpdGFuY2VUeXBlLkRFRkFVTFQpIHsKLQkJCQl0aGlzLnN0cmF0ZWd5Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJbmhlcml0YW5jZVR5cGUuREVGQVVMVCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuSk9JTkVEKSB7Ci0JCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnN0cmF0ZWd5Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBJbmhlcml0YW5jZVR5cGUuSk9JTkVEKSB7Ci0JCQkJdGhpcy5zdHJhdGVneVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKSB7Ci0JCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnN0cmF0ZWd5Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKSB7Ci0JCQkJdGhpcy5zdHJhdGVneVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5zdHJhdGVneVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykgewotCQkJCXRoaXMuc3RyYXRlZ3lWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpKTsKLQkJCX0KLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGlzY3JpbWluYXRvclZhbHVlQ29tYm8oKSB7Ci0JCVN0cmluZyBzcGVjaWZpZWRWYWx1ZSA9IHRoaXMuZW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gdGhpcy5lbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCi0JCWlmICh0aGlzLmVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQoKSkgewotCQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJaWYgKHRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCQl9Ci0JCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNldEl0ZW0oMCwgTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0VmFsdWUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uc2V0SXRlbSgwLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmICh0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLmdldEl0ZW1Db3VudCgpID09IDEpIHsKLQkJCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNldFRleHQoIiIpOwotCQkJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQl9Ci0JCX0KLQkJCQotCQlpZiAoc3BlY2lmaWVkVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoc3BlY2lmaWVkVmFsdWUpKSB7Ci0JCQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5zZXRUZXh0KHNwZWNpZmllZFZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vY29tYm8gdGV4dCBkb2VzIG5vdCB1cGRhdGUgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiAyIGVudGl0aWVzIHRoYXQgYm90aCBoYXZlIGEgZGVmYXVsdCBkaXNjcmltaW5hdG9yIHZhbHVlLiAgCi0JCQkvL2NsZWFyIHRoZSBzZWxlY3Rpb24gYW5kIHRoZW4gc2V0IGl0IGFnYWluCi0JCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW50aXR5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CQotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX0lOSEVSSVRBTkNFX1NUUkFURUdZKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSA9IGVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCQkJCSBpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdHJhdGVneVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCQkJCQlzdHJhdGVneVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5oZXJpdGFuY2VUeXBlKSk7Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUVudGl0eS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19TUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IGVudGl0eS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJCQkJaWYgKGRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLmdldFRleHQoKSA9PSBudWxsIHx8ICFkaXNjcmltaW5hdG9yVmFsdWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKGRpc2NyaW1pbmF0b3JWYWx1ZSkpIHsKLQkJCQkJCWlmIChkaXNjcmltaW5hdG9yVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJCWRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNldFRleHQoZGlzY3JpbWluYXRvclZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQkJCQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUVudGl0eS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVkFMVUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlRGlzY3JpbWluYXRvclZhbHVlQ29tYm8oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2NyaW1pbmF0b3JDb2x1bW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX1NQRUNJRklFRF9OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZUNvbHVtbk5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19ERUZBVUxUX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlRGVmYXVsdENvbHVtbk5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSURpc2NyaW1pbmF0b3JDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSURJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsKLQkJCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCQkJCQlkaXNjcmltaW5hdG9yVHlwZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGlzY3JpbWluYXRvclR5cGUpKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnBrSm9pbkNvbHVtbnNDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ1ZDM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIEludmVyc2VKb2luQ29sdW1uRGlhbG9nIGV4dGVuZHMgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIHsKLQotCUludmVyc2VKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwgSUpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJc3VwZXIocGFyZW50LCBqb2luVGFibGUpOwotCX0KLQotCUludmVyc2VKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkludmVyc2VKb2luQ29sdW1uRGlhbG9nX2VkaXRJbnZlcnNlSm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOYW1lQ29tYm8oKSB7Ci0JCWlmIChnZXRKb2luVGFibGUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSAhPSBudWxsKSB7Ci0JCQlnZXROYW1lQ29tYm8oKS5hZGQoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkludmVyc2VKb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW0sIGdldEpvaW5Db2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKSk7Ci0JCX0KLQkJVGFibGUgam9pbkRCVGFibGUgPSBnZXRKb2luVGFibGUoKS5kYlRhYmxlKCk7Ci0JCWlmIChqb2luREJUYWJsZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBqb2luREJUYWJsZS5jb2x1bW5OYW1lcygpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJZ2V0TmFtZUNvbWJvKCkuYWRkKChTdHJpbmcpIGkubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpICE9IG51bGwgJiYgZ2V0Sm9pbkNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSAhPSBudWxsKSB7Ci0JCQlnZXROYW1lQ29tYm8oKS5zZXRUZXh0KGdldEpvaW5Db2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2V0TmFtZUNvbWJvKCkuc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVSZWZlcmVuY2VkTmFtZUNvbWJvKCkgewotCQlpZiAoZ2V0Sm9pblRhYmxlKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVDb21ibygpLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZ2V0Sm9pbkNvbHVtbigpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKSk7Ci0JCX0KLQkJSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZykgZ2V0Sm9pblRhYmxlKCkuZUNvbnRhaW5lcigpOwotCQlJRW50aXR5IHRhcmdldEVudGl0eSA9IG11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLQkJCVRhYmxlIHJlZmVyZW5jZWREYlRhYmxlID0gdGFyZ2V0RW50aXR5LnByaW1hcnlEYlRhYmxlKCk7Ci0JCQlpZiAocmVmZXJlbmNlZERiVGFibGUgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHJlZmVyZW5jZWREYlRhYmxlLmNvbHVtbk5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQkJZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVDb21ibygpLmFkZCgoU3RyaW5nKSBpLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCAmJiBnZXRKb2luQ29sdW1uKCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQlnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKCkuc2V0VGV4dChnZXRKb2luQ29sdW1uKCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKCkuc2VsZWN0KDApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiNTJlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5EZWZhdWx0VHJ1ZUJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUFic3RyYWN0Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEpvaW5Db2x1bW5Db21wb3NpdGUKLQlleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQlwcml2YXRlIElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcjsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgam9pbkNvbHVtbkxpc3RlbmVyOwotCi0KLQlwcml2YXRlIEdyb3VwIGpvaW5Db2x1bW5zR3JvdXA7Ci0JQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0JTGlzdFZpZXdlciBqb2luQ29sdW1uc0xpc3RWaWV3ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gam9pbkNvbHVtbnNSZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gam9pbkNvbHVtbnNFZGl0QnV0dG9uOwotCQotCi0JCi0JcHVibGljIEpvaW5Db2x1bW5Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lciA9IGJ1aWxkU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKCk7Ci0JCXRoaXMuam9pbkNvbHVtbkxpc3RlbmVyID0gYnVpbGRKb2luQ29sdW1uTGlzdGVuZXIoKTsKLQl9Ci0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlqb2luQ29sdW1uQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3ggPSAKLQkJCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQkJY29tcG9zaXRlLCAKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1ucywgCi0JCQkJU1dULkNIRUNLKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoSm9pbkNvbHVtbkNvbXBvc2l0ZS50aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJSUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXREZWZhdWx0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQkJCQotCQkJCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gSm9pbkNvbHVtbkNvbXBvc2l0ZS50aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY3JlYXRlSm9pbkNvbHVtbigwKTsKLQkJCQkJSm9pbkNvbHVtbkNvbXBvc2l0ZS50aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5hZGQoam9pbkNvbHVtbik7Ci0JCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSm9pbkNvbHVtbkNvbXBvc2l0ZS50aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uc0dyb3VwID0gCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlR3JvdXAoCi0JCQkJY29tcG9zaXRlLCAKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9qb2luQ29sdW1uKTsKLQkJdGhpcy5qb2luQ29sdW1uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmpvaW5Db2x1bW5zR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcih0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYnVpbGRKb2luQ29sdW1uc0xpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldExpc3QoKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TKTsKLQkJCi0JCUJ1dHRvbiBhZGRKb2luQ29sdW1uQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbih0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX2FkZCwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWFkZEpvaW5Db2x1bW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWFkZEpvaW5Db2x1bW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkSm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCXRoaXMuam9pbkNvbHVtbnNFZGl0QnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbih0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX2VkaXQsIFNXVC5OT05FKTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWRpdEpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uc1JlbW92ZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24odGhpcy5qb2luQ29sdW1uc0dyb3VwLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9yZW1vdmUsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJdGhpcy5qb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5qb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVFbmFibGVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpewotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiAoKElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKSBpbnB1dEVsZW1lbnQpLmdldEpvaW5Db2x1bW5zKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChJSm9pbkNvbHVtbikgZWxlbWVudDsKLQkJCQlyZXR1cm4gKEpvaW5Db2x1bW5Db21wb3NpdGUudGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuc2l6ZSgpID09IDApID8KLQkJCQkJYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pCi0JCQkJOgotCQkJCQlidWlsZEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JU3RyaW5nIGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MYWJlbChJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQl9Ci0JCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSxqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQkJCX0KLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQkKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBqb2luQ29sdW1uQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19TUEVDSUZJRURfTkFNRQotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJTmFtZWRDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU5BTUVEX0NPTFVNTl9fREVGQVVMVF9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19TUEVDSUZJRURfVEFCTEUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Q29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9DT0xVTU5fX0RFRkFVTFRfVEFCTEUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Sm9pbkNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfSk9JTl9DT0xVTU5fX1NQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdEpvaW5Db2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0pPSU5fQ09MVU1OX19ERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWpvaW5Db2x1bW5zTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZEpvaW5Db2x1bW4oKSB7Ci0JCUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJdGhpcy5hZGRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2cpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coSm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGluZGV4ID0gdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpOwotCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNyZWF0ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQl0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5hZGQoam9pbkNvbHVtbik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCkpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKGRpYWxvZy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJaWYgKCFkaWFsb2cuaXNEZWZhdWx0VGFibGVTZWxlY3RlZCgpKSB7Ci0JCQkvL25vdCBjaGVja2luZyB0aGlzIGZvciBuYW1lIGFuZCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGJlY2F1c2UgdGhlcmUgaXMgbm8KLQkJCS8vZGVmYXVsdCBvcHRpb24gd2hlbiB5b3UgYXJlIGFkZGluZyBhIHNlY29uZCBqb2luIGNvbHVtbi4gIFRoZXJlIGlzIGFsd2F5cwotCQkJLy9hdCBsZWFzdCAxIGpvaW4gY29sdW1uICh0aGUgZGVmYXVsdCkKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoZGlhbG9nLmdldFNlbGVjdGVkVGFibGUoKSk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBlZGl0Sm9pbkNvbHVtbigpIHsKLQkJSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldFNlbGVjdGVkSm9pbkNvbHVtbigpOwotCQlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGpvaW5Db2x1bW4pOwotCQllZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSm9pbkNvbHVtbiBnZXRTZWxlY3RlZEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSUpvaW5Db2x1bW4pICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coSm9pbkNvbHVtbkRpYWxvZyBkaWFsb2csIElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQllZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChkaWFsb2csIGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChKb2luQ29sdW1uRGlhbG9nIGRpYWxvZywgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKTsKLQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGlhbG9nLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCVN0cmluZyB0YWJsZSA9IGRpYWxvZy5nZXRTZWxlY3RlZFRhYmxlKCk7Ci0KLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHROYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJfQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uTmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQkJCi0JCWlmIChkaWFsb2cuaXNEZWZhdWx0VGFibGVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpICE9IG51bGwpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkuZXF1YWxzKHRhYmxlKSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKHRhYmxlKTsKLQkJfQotCi0JCURlZmF1bHRUcnVlQm9vbGVhbiBpbnNlcnRhYmxlID0gZGlhbG9nLmdldEluc2VydGFibGUoKTsKLQkJaWYgKGpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpICE9IGluc2VydGFibGUpIHsKLQkJCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShpbnNlcnRhYmxlKTsKLQkJfQotCi0JCURlZmF1bHRUcnVlQm9vbGVhbiB1cGRhdGFibGUgPSBkaWFsb2cuZ2V0VXBkYXRhYmxlKCk7Ci0JCWlmIChqb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpICE9IHVwZGF0YWJsZSkgewotCQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUodXBkYXRhYmxlKTsKLQkJfQotCX0KLQkKLQl2b2lkIHJlbW92ZUpvaW5Db2x1bW4oKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19TUEVDSUZJRURfSk9JTl9DT0xVTU5TKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJSm9pbkNvbHVtbkNvbXBvc2l0ZS50aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpKTsKLQkJCQkJSm9pbkNvbHVtbkNvbXBvc2l0ZS50aGlzLnVwZGF0ZUVuYWJsZW1lbnQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkgewotCQkJCSgoSUpvaW5Db2x1bW4pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5qb2luQ29sdW1uTGlzdGVuZXIpOwotCQkJfQotCQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUpIHsKLQkJCQkoKElKb2luQ29sdW1uKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuam9pbkNvbHVtbkxpc3RlbmVyKTsJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUdyb3VwKEdyb3VwIGdyb3VwLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJZ3JvdXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cC5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQlncm91cC5nZXRDaGlsZHJlbigpW2ldLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0JCi0JfQotCi0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5lQWRhcHRlcnMoKS5hZGQodGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIpOwotCQkJZm9yIChJdGVyYXRvciBpID0gdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCSgoSUpvaW5Db2x1bW4pIGkubmV4dCgpKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5qb2luQ29sdW1uTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJKChJSm9pbkNvbHVtbikgaS5uZXh0KCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCQl0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpIG9iajsKLQkJaWYgKHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKSB7Ci0JCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0SW5wdXQodGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKTsKLQkJCi0KLQkJdXBkYXRlRW5hYmxlbWVudCgpOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dCh0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpOwkJCi0JfQotCQotCXZvaWQgdXBkYXRlRW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiBncm91cEVuYWJsZWRTdGF0ZSA9IHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWVuYWJsZUdyb3VwKHRoaXMuam9pbkNvbHVtbnNHcm91cCwgZ3JvdXBFbmFibGVkU3RhdGUpOwotCi0JCXRoaXMuam9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChncm91cEVuYWJsZWRTdGF0ZSAmJiAhKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuaXNFbXB0eSgpKTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0RW5hYmxlZChncm91cEVuYWJsZWRTdGF0ZSAmJiAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5zaXplKCkgPT0gMSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2YjE5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5EZWZhdWx0VHJ1ZUJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSm9pbkNvbHVtbkRpYWxvZyBleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZzxJSm9pbkNvbHVtbj4gewotCQotCXByaXZhdGUgQ29tYm8gdGFibGVDb21ibzsKLQlwcml2YXRlIENvbWJvVmlld2VyIGluc2VydGFibGVDb21ib1ZpZXdlcjsKLQlwcml2YXRlIENvbWJvVmlld2VyIHVwZGF0YWJsZUNvbWJvVmlld2VyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRUYWJsZVNlbGVjdGVkOwotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkVGFibGU7Ci0JcHJpdmF0ZSBEZWZhdWx0VHJ1ZUJvb2xlYW4gaW5zZXJ0YWJsZTsKLQlwcml2YXRlIERlZmF1bHRUcnVlQm9vbGVhbiB1cGRhdGFibGU7Ci0JCi0JSm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCi0JCUxhYmVsIHRhYmxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCXRhYmxlTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ190YWJsZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy50YWJsZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQl0aGlzLnRhYmxlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBvcHVsYXRlTmFtZUNvbWJvKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBvcHVsYXRlTmFtZUNvbWJvKCk7Ci0JCQl9Ci0JCX0pOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLnRhYmxlQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCS8vUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnRhYmxlQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fUkVGRVJFTkNFRF9DT0xVTU4pOwotCQlwb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQotCQlMYWJlbCBpbnNlcnRhYmxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWluc2VydGFibGVMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2luc2VydGFibGUpOwotCQlpbnNlcnRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQotCQl0aGlzLmluc2VydGFibGVDb21ib1ZpZXdlciA9IHRoaXMuYnVpbGRJbnNlcnRhYmxlQ29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJdGhpcy5pbnNlcnRhYmxlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldENvbWJvKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFKTsKLQkKLQkJTGFiZWwgdXBkYXRhYmxlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCXVwZGF0YWJsZUxhYmVsLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfdXBkYXRhYmxlKTsKLQkJdXBkYXRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyID0gdGhpcy5idWlsZFVwZGF0YWJsZUNvbWJvVmlld2VyKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX1VQREFUQUJMRSk7Ci0JCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBidWlsZEluc2VydGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZERlZmF1bHRUcnVlTGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLmFkZChEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKSk7Ci0JCQotCQlEZWZhdWx0VHJ1ZUJvb2xlYW4gc2VsID0gKHRoaXMuam9pbkNvbHVtbigpID09IG51bGwpID8gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQgOiB0aGlzLmpvaW5Db2x1bW4oKS5nZXRJbnNlcnRhYmxlKCk7Ci0JCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsKSk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkRGVmYXVsdFRydWVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50ID09IERlZmF1bHRUcnVlQm9vbGVhbi5ERUZBVUxUKSB7Ci0JCQkJCS8vVE9ETyBuZWVkIHRvIG1vdmUgdGhpcyB0byB0aGUgbW9kZWwsIGRvbid0IHdhbnQgaGFyZGNvZGVkIFN0cmluZwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZGVmYXVsdFRydWUsICJUcnVlIik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgYnVpbGRVcGRhdGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZERlZmF1bHRUcnVlTGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLmFkZChEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKSk7Ci0JCURlZmF1bHRUcnVlQm9vbGVhbiBzZWwgPSAodGhpcy5qb2luQ29sdW1uKCkgPT0gbnVsbCkgPyBEZWZhdWx0VHJ1ZUJvb2xlYW4uREVGQVVMVCA6IHRoaXMuam9pbkNvbHVtbigpLmdldFVwZGF0YWJsZSgpOwotCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbCkpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVRhYmxlQ29tYm8oKSB7Ci0JCXRoaXMudGFibGVDb21iby5hZGQoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdFRhYmxlTmFtZSgpKSk7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gdGFibGVzID0gc2NoZW1hLnRhYmxlTmFtZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCggdGFibGVzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy50YWJsZUNvbWJvLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoc3BlY2lmaWVkVGFibGVOYW1lKCkgIT0gbnVsbCkgewotCQkJdGhpcy50YWJsZUNvbWJvLnNldFRleHQoc3BlY2lmaWVkVGFibGVOYW1lKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy50YWJsZUNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUoKTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlTmFtZSgpIHsKLQkJaWYgKGdldEpvaW5Db2x1bW4oKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgdGFibGVOYW1lKCkgewotCQlpZiAodGhpcy50YWJsZUNvbWJvICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnRhYmxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRUYWJsZU5hbWUoKTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUYWJsZU5hbWUoKSA9PSBudWxsKSA/IGRlZmF1bHRUYWJsZU5hbWUoKSA6IHRoaXMuc3BlY2lmaWVkVGFibGVOYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0JCi0JcHJpdmF0ZSBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0VGFibGVTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlU2VsZWN0ZWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFRhYmxlOwotCX0KLQotCXB1YmxpYyBEZWZhdWx0VHJ1ZUJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW5zZXJ0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgRGVmYXVsdFRydWVCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQl0aGlzLmRlZmF1bHRUYWJsZVNlbGVjdGVkID0gdGhpcy50YWJsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMDsKLQkJdGhpcy5zZWxlY3RlZFRhYmxlID0gdGhpcy50YWJsZUNvbWJvLmdldFRleHQoKTsKLQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXRoaXMuaW5zZXJ0YWJsZSA9IChEZWZhdWx0VHJ1ZUJvb2xlYW4pICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSB0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXRoaXMudXBkYXRhYmxlID0gKERlZmF1bHRUcnVlQm9vbGVhbikgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyNGE5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyBleHRlbmRzIEpvaW5Db2x1bW5EaWFsb2cgewotCi0JcHJpdmF0ZSBJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlOwotCQotCUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2coU2hlbGwgcGFyZW50LCBJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JfQotCi0JSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyhTaGVsbCBwYXJlbnQsIElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocGFyZW50LCBqb2luQ29sdW1uKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlID0gKElBc3NvY2lhdGlvbk92ZXJyaWRlKSBqb2luQ29sdW1uLmVDb250YWluZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUudHlwZU1hcHBpbmcoKS5kYlNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEpvaW5Db2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlLnR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS50eXBlTWFwcGluZygpLnByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlJQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlLmdldE93bmVyKCkuYXR0cmlidXRlTWFwcGluZyh0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCB8fCAhKGF0dHJpYnV0ZU1hcHBpbmcgaW5zdGFuY2VvZiBJUmVsYXRpb25zaGlwTWFwcGluZykpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gKChJUmVsYXRpb25zaGlwTWFwcGluZykgYXR0cmlidXRlTWFwcGluZykuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJaWYgKHRhcmdldEVudGl0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGFyZ2V0RW50aXR5LnByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4YTc0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8vaWYgdGhlcmUgaXMgb25seSAxIGpvaW5Db2x1bW4gYW5kIHRoZSB1c2VyIGlzIGVkaXRpbmcgaXQsIHRoZXkgc2hvdWxkIGJlCi0vL2FibGUgdG8gZGVmaW5lIGRlZmF1bHRzLiAgb3RoZXJ3aXNlLCB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYWxsb3cgaXQuCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uRGlhbG9nPElKb2luQ29sdW1uPiB7Ci0KLQlwcml2YXRlIElKb2luVGFibGUgam9pblRhYmxlOwotCQotCUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pblRhYmxlID0gam9pblRhYmxlOwotCX0KLQotCUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocGFyZW50LCBqb2luQ29sdW1uKTsKLQkJdGhpcy5qb2luVGFibGUgPSAoSUpvaW5UYWJsZSkgam9pbkNvbHVtbi5lQ29udGFpbmVyKCk7Ci0JfQotCXByb3RlY3RlZCBJSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0Sm9pblRhYmxlKCkuZGJUYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKLQkJSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZykgZ2V0Sm9pblRhYmxlKCkuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gbXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnR5cGVNYXBwaW5nKCkucHJpbWFyeURiVGFibGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYwYTA0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyBleHRlbmRzIEpvaW5Db2x1bW5EaWFsb2cgewotCi0JcHJpdmF0ZSBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotCQotCUpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2coU2hlbGwgcGFyZW50LCBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA9IHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JfQotCi0JSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsIElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocGFyZW50LCBqb2luQ29sdW1uKTsKLQkJdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nID0gKElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKSBqb2luQ29sdW1uLmVDb250YWluZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGVOYW1lKCkgewotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRKb2luQ29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50eXBlTWFwcGluZygpLmdldFRhYmxlTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2NoZW1hIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy50eXBlTWFwcGluZygpLmRiU2NoZW1hKCk7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpOwotCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBzY2hlbWEudGFibGVOYW1lZCh0YWJsZU5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlJRW50aXR5IHRhcmdldEVudGl0eSA9IHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiB0YXJnZXRFbnRpdHkucHJpbWFyeURiVGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmUyMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQWJzdHJhY3RDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUFic3RyYWN0Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbnNDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlCi17Ci0JCi0JcHJpdmF0ZSBPd25lciBvd25lcjsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgam9pbkNvbHVtbnNPd25lckxpc3RlbmVyOwotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIGpvaW5Db2x1bW5zTGlzdFZpZXdlcjsKLQkJCi0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIGpvaW5Db2x1bW5MaXN0ZW5lcjsKLQkKLQlwcml2YXRlIEdyb3VwIGpvaW5Db2x1bW5zR3JvdXA7Ci0JcHJpdmF0ZSBCdXR0b24gam9pbkNvbHVtbnNBZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gam9pbkNvbHVtbnNSZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gam9pbkNvbHVtbnNFZGl0QnV0dG9uOwotCQotCi0JcHVibGljIEpvaW5Db2x1bW5zQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnksIFN0cmluZyBncm91cFRpdGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNPd25lckxpc3RlbmVyID0gYnVpbGRKb2luQ29sdW1uc093bmVyTGlzdGVuZXIoKTsKLQkJdGhpcy5qb2luQ29sdW1uTGlzdGVuZXIgPSBidWlsZEpvaW5Db2x1bW5MaXN0ZW5lcigpOwotCQl0aGlzLmpvaW5Db2x1bW5zR3JvdXAuc2V0VGV4dChncm91cFRpdGxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkSm9pbkNvbHVtbnNPd25lckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJam9pbkNvbHVtbnNPd25lckNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkSm9pbkNvbHVtbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJam9pbkNvbHVtbkNoYW5nZWQobm90aWZpY2F0aW9uLCBqb2luQ29sdW1uc0xpc3RWaWV3ZXIpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zR3JvdXAgPSAKLQkJCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cCgKLQkJCQljb21wb3NpdGUsIAotCQkJCSIiKTsKLQkJdGhpcy5qb2luQ29sdW1uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmpvaW5Db2x1bW5zR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcih0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYnVpbGRKb2luQ29sdW1uc0xpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldExpc3QoKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TKTsKLQkJCi0JCXRoaXMuam9pbkNvbHVtbnNBZGRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKHRoaXMuam9pbkNvbHVtbnNHcm91cCwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9hZGQsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl0aGlzLmpvaW5Db2x1bW5zQWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLmpvaW5Db2x1bW5zQWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW93bmVyLmFkZEpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24odGhpcy5qb2luQ29sdW1uc0dyb3VwLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX2VkaXQsIFNXVC5OT05FKTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWRpdEpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uc1JlbW92ZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24odGhpcy5qb2luQ29sdW1uc0dyb3VwLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX3JlbW92ZSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKXsKLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJCi0JCQl9Ci0JCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChPd25lcikgaW5wdXRFbGVtZW50KS5nZXRKb2luQ29sdW1ucygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSUpvaW5Db2x1bW4pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIChKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLm93bmVyLmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgPwotCQkJCQlidWlsZEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKQotCQkJCToKLQkJCQkJYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRKb2luQ29sdW1uTGFiZWwoSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRKb2luQ29sdW1uTGFiZWwoSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkJCi0JCX0KLQl9Ci0KLQl2b2lkIGVkaXRKb2luQ29sdW1uKCkgewotCQl0aGlzLm93bmVyLmVkaXRKb2luQ29sdW1uKGdldFNlbGVjdGVkSm9pbkNvbHVtbigpKTsKLQl9Ci0JCQotCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMub3duZXIuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJSm9pbkNvbHVtbiBnZXRTZWxlY3RlZEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSUpvaW5Db2x1bW4pICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgam9pbkNvbHVtbnNPd25lckNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChvd25lci5vd25pbmdGZWF0dXJlQ2xhc3MoKSkgPT0gb3duZXIuc3BlY2lmaWVkSm9pbkNvbHVtbnNGZWF0dXJlSWQoKSkgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKSB7Ci0JCQkJKChJSm9pbkNvbHVtbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLmVBZGFwdGVycygpLmFkZCh0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSkgewotCQkJCSgoSUpvaW5Db2x1bW4pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5qb2luQ29sdW1uTGlzdGVuZXIpOwkJCQkKLQkJCX0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWpvaW5Db2x1bW5zTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCXVwZGF0ZUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbmFibGVHcm91cChHcm91cCBncm91cCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWdyb3VwLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXAuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7IGkrKykgewotCQkJZ3JvdXAuZ2V0Q2hpbGRyZW4oKVtpXS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9CQotCX0KLQkJcHJvdGVjdGVkIHZvaWQgam9pbkNvbHVtbkNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgZmluYWwgTGlzdFZpZXdlciBsaXN0Vmlld2VyKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJTmFtZWRDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU5BTUVEX0NPTFVNTl9fU1BFQ0lGSUVEX05BTUUKLQkJCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19ERUZBVUxUX05BTUUKLQkJCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19TUEVDSUZJRURfVEFCTEUKLQkJCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19ERUZBVUxUX1RBQkxFCi0JCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQWJzdHJhY3RKb2luQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9KT0lOX0NPTFVNTl9fU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUKLQkJCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdEpvaW5Db2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0pPSU5fQ09MVU1OX19ERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLm93bmVyICE9IG51bGwpIHsKLQkJCXRoaXMub3duZXIuZ2V0RU9iamVjdCgpLmVBZGFwdGVycygpLmFkZCh0aGlzLmpvaW5Db2x1bW5zT3duZXJMaXN0ZW5lcik7Ci0JCQlmb3IgKElKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLm93bmVyLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCQlqb2luQ29sdW1uLmVBZGFwdGVycygpLmFkZCh0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5vd25lciAhPSBudWxsKSB7Ci0JCQlmb3IgKElKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLm93bmVyLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCQlqb2luQ29sdW1uLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCQl0aGlzLm93bmVyLmdldEVPYmplY3QoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5qb2luQ29sdW1uc093bmVyTGlzdGVuZXIpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMub3duZXIgPSAoT3duZXIpIG9iajsKLQkJaWYgKHRoaXMub3duZXIgPT0gbnVsbCkgewotCQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldElucHV0KHRoaXMub3duZXIpOwotCQkKLQkJdXBkYXRlRW5hYmxlbWVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuYWJsZW1lbnQoKSB7Ci0JCXVwZGF0ZUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCX0KLQkKLQl2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiBncm91cEVuYWJsZWRTdGF0ZSA9IHRoaXMub3duZXIuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQllbmFibGVHcm91cCh0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIGdyb3VwRW5hYmxlZFN0YXRlKTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZ3JvdXBFbmFibGVkU3RhdGUgJiYgISgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmlzRW1wdHkoKSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNFZGl0QnV0dG9uLnNldEVuYWJsZWQoZ3JvdXBFbmFibGVkU3RhdGUgJiYgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuc2l6ZSgpID09IDEpOwotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJZW5hYmxlR3JvdXAodGhpcy5qb2luQ29sdW1uc0dyb3VwLCBlbmFibGVkKTsKLQkJdGhpcy5qb2luQ29sdW1uc0FkZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldExpc3QoKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgT3duZXIgewotCQlpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNGZWF0dXJlSWQoKTsKLQkJCi0JCUNsYXNzIG93bmluZ0ZlYXR1cmVDbGFzcygpOwotCi0JCUVPYmplY3QgZ2V0RU9iamVjdCgpOwotCQkKLQkJYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCQotCQlMaXN0PElKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpOwotCQkKLQkJTGlzdDxJSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJCi0JCUlKb2luQ29sdW1uIGNyZWF0ZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkJCi0JCXZvaWQgYWRkSm9pbkNvbHVtbigpOwotCQkKLQkJdm9pZCBlZGl0Sm9pbkNvbHVtbihJSm9pbkNvbHVtbiBqb2luQ29sdW1uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Kb2luVGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZDYwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuSm9pbkNvbHVtbnNDb21wb3NpdGUuT3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEpvaW5UYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQkKLQlwcml2YXRlIElKb2luVGFibGUgam9pblRhYmxlOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBqb2luVGFibGVMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBUYWJsZUNvbWJvIHRhYmxlQ29tYm87Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBvdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94OwotCXByaXZhdGUgSm9pbkNvbHVtbnNDb21wb3NpdGUgam9pbkNvbHVtbnNDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBKb2luQ29sdW1uc0NvbXBvc2l0ZSBpbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGU7Ci0KLQlwdWJsaWMgSm9pblRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5qb2luVGFibGVMaXN0ZW5lciA9IGJ1aWxkSm9pblRhYmxlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luVGFibGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWpvaW5UYWJsZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLnRhYmxlQ29tYm8ucG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZihkYXRhYmFzZSA9PSBKb2luVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUNvbWJvLmdldERhdGFiYXNlKCkpIHsKLQkJCQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMudGFibGVDb21iby5wb3B1bGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmKHNjaGVtYSA9PSBKb2luVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUNvbWJvLmdldFRhYmxlU2NoZW1hKCkpIHsKLQkJCQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMudGFibGVDb21iby5wb3B1bGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBUYWJsZSB0YWJsZSkgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0JCX07Ci0gICAgfQotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJaWYodGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5qb2luVGFibGUuZ2V0SnBhUHJvamVjdCgpOwotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IGpwYVByb2plY3QuY29ubmVjdGlvblByb2ZpbGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbmFtZSk7Ci0JCQotCQl0aGlzLnRhYmxlQ29tYm8gPSBuZXcgVGFibGVDb21ibyhjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGFibGVDb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMudGFibGVDb21iby5nZXRDb21ibygpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX05BTUUpOwotCQkKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94ID0gCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJCWNvbXBvc2l0ZSwgCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1ucywgCi0JCQkJU1dULkNIRUNLKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IEpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQkJCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBKb2luVGFibGVDb21wb3NpdGUudGhpcy5qb2luVGFibGUuY3JlYXRlSm9pbkNvbHVtbigwKTsKLQkJCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuYWRkKGpvaW5Db2x1bW4pOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9qb2luQ29sdW1uKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zLCBTV1QuQ0hFQ0spOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMub3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJSUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBKb2luVGFibGVDb21wb3NpdGUudGhpcy5qb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCQkJSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmpvaW5UYWJsZS5jcmVhdGVJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLmFkZChqb2luQ29sdW1uKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy5qb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZShjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCksIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfaW52ZXJzZUpvaW5Db2x1bW4pOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXZvaWQgYWRkSm9pbkNvbHVtbigpIHsKLQkJSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9IG5ldyBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgdGhpcy5qb2luVGFibGUpOwotCQl0aGlzLmFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uRnJvbURpYWxvZyhKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9IHRoaXMuam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpOwotCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5qb2luVGFibGUuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCXRoaXMuam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuYWRkKGpvaW5Db2x1bW4pOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXZvaWQgYWRkSW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCUludmVyc2VKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCB0aGlzLmpvaW5UYWJsZSk7Ci0JCXRoaXMuYWRkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbkZyb21EaWFsb2coSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9IHRoaXMuam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnNpemUoKTsKLQkJSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuam9pblRhYmxlLmNyZWF0ZUludmVyc2VKb2luQ29sdW1uKGluZGV4KTsKLQkJdGhpcy5qb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKGpvaW5Db2x1bW4pOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0Jdm9pZCBlZGl0Sm9pbkNvbHVtbihJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cgPSBuZXcgSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGpvaW5Db2x1bW4pOwotCQllZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nLCBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJZWRpdEpvaW5Db2x1bW5EaWFsb2dPa2QoZGlhbG9nLCBqb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW5EaWFsb2dPa2QoSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZywgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKTsKLQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGlhbG9nLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHROYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJfQotCQkKLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZVNlbGVjdGVkKCkpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwgfHwgIWpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKS5lcXVhbHMocmVmZXJlbmNlZENvbHVtbk5hbWUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JfQotCQotCQotCXZvaWQgZWRpdEludmVyc2VKb2luQ29sdW1uKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IEludmVyc2VKb2luQ29sdW1uRGlhbG9nKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBqb2luQ29sdW1uKTsKLQkJZWRpdEpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZywgam9pbkNvbHVtbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGpvaW5UYWJsZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJSm9pblRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklKT0lOX1RBQkxFX19TUEVDSUZJRURfSk9JTl9DT0xVTU5TKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlvdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbihqb2luVGFibGUuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElKb2luVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUpPSU5fVEFCTEVfX1NQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OUykgewotCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlvdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveC5zZXRTZWxlY3Rpb24oam9pblRhYmxlLmNvbnRhaW5zU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmpvaW5UYWJsZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5qb2luVGFibGVMaXN0ZW5lcik7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwkJCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5qb2luVGFibGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuam9pblRhYmxlTGlzdGVuZXIpOwotCQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmpvaW5UYWJsZSA9IChJSm9pblRhYmxlKSBvYmo7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKHRoaXMuam9pblRhYmxlKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZShuZXcgSm9pbkNvbHVtbnNPd25lcih0aGlzLmpvaW5UYWJsZSkpOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZShuZXcgSW52ZXJzZUpvaW5Db2x1bW5zT3duZXIodGhpcy5qb2luVGFibGUpKTsKLQkJCi0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5qb2luVGFibGUuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5qb2luVGFibGUuY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy50YWJsZUNvbWJvLmRpc3Bvc2UoKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgSm9pbkNvbHVtbnNPd25lciBleHRlbmRzIEpwYUVPYmplY3QgaW1wbGVtZW50cyBPd25lciB7Ci0JCQotCQlwcml2YXRlIElKb2luVGFibGUgam9pblRhYmxlOwotCQkKLQkJcHVibGljIEpvaW5Db2x1bW5zT3duZXIoSUpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbigpIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmFkZEpvaW5Db2x1bW4oKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJSm9pbkNvbHVtbiBjcmVhdGVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmNyZWF0ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdDxJSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8SUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNGZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JSk9JTl9UQUJMRV9fU1BFQ0lGSUVEX0pPSU5fQ09MVU1OUzsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIG93bmluZ0ZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJSm9pblRhYmxlLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBlZGl0Sm9pbkNvbHVtbihJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy5lZGl0Sm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEludmVyc2VKb2luQ29sdW1uc093bmVyIGV4dGVuZHMgSnBhRU9iamVjdCBpbXBsZW1lbnRzIE93bmVyIHsKLQkJCi0JCXByaXZhdGUgSUpvaW5UYWJsZSBqb2luVGFibGU7Ci0JCQotCQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5zT3duZXIoSUpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbigpIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmFkZEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCQkKLQkJcHVibGljIElKb2luQ29sdW1uIGNyZWF0ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PElKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8SUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zRmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUpPSU5fVEFCTEVfX1NQRUNJRklFRF9JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIG93bmluZ0ZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJSm9pblRhYmxlLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBlZGl0Sm9pbkNvbHVtbihJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy5lZGl0SW52ZXJzZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0xvYkNoZWNrQm94LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0xvYkNoZWNrQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTk0NGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Mb2JDaGVja0JveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTG9iQ2hlY2tCb3ggZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgSUJhc2ljIGJhc2ljTWFwcGluZzsKLQlwcml2YXRlIEFkYXB0ZXIgYmFzaWNNYXBwaW5nTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uOwotCi0KLQlwdWJsaWMgTG9iQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkQmFzaWNNYXBwaW5nTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQmFzaWNNYXBwaW5nTGlzdGVuZXIoKSB7Ci0JCXRoaXMuYmFzaWNNYXBwaW5nTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlic2FpY01hcHBpbmdDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFyZW50LCAKLQkJCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX2xvYkxhYmVsLAotCQkJCQkJU1dULkNIRUNLKTsKLQkJCi0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTG9iQ2hlY2tCb3gudGhpcy5sb2JTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMb2JDaGVja0JveC50aGlzLmxvYlNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXZvaWQgbG9iU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJYm9vbGVhbiBsb2IgPSB0aGlzLmJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHRoaXMuYmFzaWNNYXBwaW5nLmlzTG9iKCkgIT0gbG9iKSB7Ci0JCQl0aGlzLmJhc2ljTWFwcGluZy5zZXRMb2IobG9iKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBic2FpY01hcHBpbmdDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUJhc2ljLmNsYXNzKSA9PSAKLQkJCQlKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklCQVNJQ19fTE9CKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5iYXNpY01hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5iYXNpY01hcHBpbmcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuYmFzaWNNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuYmFzaWNNYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMuYmFzaWNNYXBwaW5nLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmJhc2ljTWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuYmFzaWNNYXBwaW5nID0gKElCYXNpYykgb2JqOwotCQlwb3B1bGF0ZUJ1dHRvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZUJ1dHRvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVCdXR0b24oKSB7Ci0JCWJvb2xlYW4gbG9iID0gZmFsc2U7Ci0JCWlmICh0aGlzLmJhc2ljTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlsb2IgID0gdGhpcy5iYXNpY01hcHBpbmcuaXNMb2IoKTsKLQkJfQotCQkKLQkJaWYgKHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpICE9IGxvYikgewotCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKGxvYik7Ci0JCX0KLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdGhpcy5idXR0b247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYW55VG9NYW55Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb01hbnlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1M2ViYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb01hbnlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJTWFueVRvTWFueSBtYW55VG9NYW55OwotCQotCXByaXZhdGUgVGFyZ2V0RW50aXR5Q2hvb3NlciB0YXJnZXRFbnRpdHlDaG9vc2VyOwotCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgZmV0Y2hUeXBlQ29tYm9WaWV3ZXI7Ci0KLQlwcml2YXRlIE1hcHBlZEJ5Q29tYm8gbWFwcGVkQnlDb21ibzsKLQotCXByaXZhdGUgQ2FzY2FkZUNvbXBvc2l0ZSBjYXNjYWRlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBPcmRlcmluZ0NvbXBvc2l0ZSBvcmRlcmluZ0NvbXBvc2l0ZTsKLQotCXByaXZhdGUgSm9pblRhYmxlQ29tcG9zaXRlIGpvaW5UYWJsZUNvbXBvc2l0ZTsKLQkKLQotCXB1YmxpYyBNYW55VG9NYW55Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbnRyb2wgZ2VuZXJhbENvbnRyb2wgPSBidWlsZEdlbmVyYWxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb250cm9sIGpvaW5UYWJsZUNvbnRyb2wgPSBidWlsZEpvaW5UYWJsZUNvbnRyb2woY29tcG9zaXRlKTsKLQkgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlqb2luVGFibGVDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLS8vCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCQotCQlDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCi0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRUYXJnZXRFbnRpdHlDaG9vc2VyKGdlbmVyYWxDb21wb3NpdGUsIGNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRGZXRjaExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hUeXBlQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkTWFwcGVkQnlMYWJlbChnZW5lcmFsQ29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8gPSBuZXcgTWFwcGVkQnlDb21ibyhnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8uZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZSA9IG5ldyBDYXNjYWRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCi0JCXRoaXMub3JkZXJpbmdDb21wb3NpdGUgPSBuZXcgT3JkZXJpbmdDb21wb3NpdGUoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMub3JkZXJpbmdDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXJldHVybiBnZW5lcmFsQ29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRKb2luVGFibGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24oY29tcG9zaXRlLCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLQkgICAgc2VjdGlvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlKTsKLQotCQlDb21wb3NpdGUgam9pblRhYmxlQ2xpZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoam9pblRhYmxlQ2xpZW50KTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJam9pblRhYmxlQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlID0gbmV3IEpvaW5UYWJsZUNvbXBvc2l0ZShqb2luVGFibGVDbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLm1hbnlUb01hbnkgPSAoSU1hbnlUb01hbnkpIG9iajsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLnBvcHVsYXRlKHRoaXMubWFueVRvTWFueSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIucG9wdWxhdGUoQ29tbW9uV2lkZ2V0cy5idWlsZE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0ZldGNoRW51bUhvbGRlcih0aGlzLm1hbnlUb01hbnkpKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLnBvcHVsYXRlKHRoaXMubWFueVRvTWFueSk7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLm1hbnlUb01hbnkpOwotCQlpZiAodGhpcy5tYW55VG9NYW55ICE9IG51bGwpIHsKLQkJCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMubWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCQl0aGlzLm9yZGVyaW5nQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMubWFueVRvTWFueSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMub3JkZXJpbmdDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLm9yZGVyaW5nQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIuZGlzcG9zZSgpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLmRpc3Bvc2UoKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5qb2luVGFibGVDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLm9yZGVyaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYW55VG9PbmVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFueVRvT25lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNmNkN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYW55VG9PbmVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5EZWZhdWx0VHJ1ZUJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnVtQ29tYm9WaWV3ZXIuRW51bUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE1hbnlUb09uZUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJTWFueVRvT25lIG1hbnlUb09uZTsKLQkKLQlwcml2YXRlIFRhcmdldEVudGl0eUNob29zZXIgdGFyZ2V0RW50aXR5Q2hvb3NlcjsKLQotCXByaXZhdGUgRW51bUNvbWJvVmlld2VyIGZldGNoVHlwZUNvbWJvVmlld2VyOwotCQotCXByaXZhdGUgRW51bUNvbWJvVmlld2VyIG9wdGlvbmFsQ29tYm9WaWV3ZXI7Ci0KLQlwcml2YXRlIE9yZGVyaW5nQ29tcG9zaXRlIG9yZGVyQnlDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENhc2NhZGVDb21wb3NpdGUgY2FzY2FkZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgSm9pbkNvbHVtbkNvbXBvc2l0ZSBqb2luQ29sdW1uQ29tcG9zaXRlOwotCQkKLQlwdWJsaWMgTWFueVRvT25lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbnRyb2wgZ2VuZXJhbENvbnRyb2wgPSBidWlsZEdlbmVyYWxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQkJCi0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRUYXJnZXRFbnRpdHlDaG9vc2VyKGdlbmVyYWxDb21wb3NpdGUsIGNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0YXJnZXRFbnRpdHlDaG9vc2VyLmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFSR0VUX0VOVElUWSk7Ci0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hMYWJlbChnZW5lcmFsQ29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEZldGNoVHlwZUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19GRVRDSF9UWVBFKTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRPcHRpb25hbExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRFbnVtQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUgPSBuZXcgQ2FzY2FkZUNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5Db21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5qb2luQ29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsJCi0KLQkJcmV0dXJuIGdlbmVyYWxDb21wb3NpdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5tYW55VG9PbmUgPSAoSU1hbnlUb09uZSkgb2JqOwotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIucG9wdWxhdGUodGhpcy5tYW55VG9PbmUpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKENvbW1vbldpZGdldHMuYnVpbGRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRmV0Y2hFbnVtSG9sZGVyKHRoaXMubWFueVRvT25lKSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5wb3B1bGF0ZShDb21tb25XaWRnZXRzLmJ1aWxkT3B0aW9uYWxIb2xkZXIodGhpcy5tYW55VG9PbmUpKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMubWFueVRvT25lKTsKLQkJdGhpcy5qb2luQ29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMubWFueVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5Db21wb3NpdGUucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5kaXNwb3NlKCk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQl0aGlzLm9wdGlvbmFsQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5Db21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRCeUNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZEJ5Q29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzOTg4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZEJ5Q29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTm9uT3duaW5nTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWFwcGVkQnlDb21ibyBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBJTm9uT3duaW5nTWFwcGluZyBub25Pd25pbmdNYXBwaW5nOwotCXByaXZhdGUgQWRhcHRlciBub25Pd25pbmdNYXBwaW5nTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDQ29tYm8gY29tYm87Ci0JCi0JcHVibGljIE1hcHBlZEJ5Q29tYm8oQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMubm9uT3duaW5nTWFwcGluZ0xpc3RlbmVyID0gYnVpbGRMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCW5vbk93bmluZ01hcHBpbmdDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5jb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tYm8sSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfTUFQUEVEX0JZKTsKLQkJdGhpcy5jb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbWFwcGVkQnkgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCWlmIChtYXBwZWRCeS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbWFwcGVkQnkgPSBudWxsOwotCQkJCQlpZiAoZ2V0Tm9uT3duaW5nTWFwcGluZygpLmdldE1hcHBlZEJ5KCkgPT0gbnVsbCB8fCBnZXROb25Pd25pbmdNYXBwaW5nKCkuZ2V0TWFwcGVkQnkoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZ2V0Tm9uT3duaW5nTWFwcGluZygpLmdldE1hcHBlZEJ5KCkgPT0gbnVsbCB8fCAhZ2V0Tm9uT3duaW5nTWFwcGluZygpLmdldE1hcHBlZEJ5KCkuZXF1YWxzKG1hcHBlZEJ5KSkgewotCQkJCQlnZXROb25Pd25pbmdNYXBwaW5nKCkuc2V0TWFwcGVkQnkobWFwcGVkQnkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSU5vbk93bmluZ01hcHBpbmcgZ2V0Tm9uT3duaW5nTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nTWFwcGluZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMubm9uT3duaW5nTWFwcGluZyA9IChJTm9uT3duaW5nTWFwcGluZykgb2JqOwotCQkKLQkJaWYgKHRoaXMubm9uT3duaW5nTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQkJcG9wdWxhdGVDaG9pY2VzKCk7Ci0JCXBvcHVsYXRlTWFwcGVkQnlUZXh0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNob2ljZXMoKSB7Ci0JCWlmICh0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJdGhpcy5jb21iby5yZW1vdmVBbGwoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IHRoaXMubm9uT3duaW5nTWFwcGluZy5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY29tYm8uYWRkKGkubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNYXBwZWRCeVRleHQoKSB7Ci0JCVN0cmluZyBtYXBwZWRCeSA9IHRoaXMubm9uT3duaW5nTWFwcGluZy5nZXRNYXBwZWRCeSgpOwotCQlpZiAobWFwcGVkQnkgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLmNvbWJvLmdldFRleHQoKS5lcXVhbHMobWFwcGVkQnkpKSB7Ci0JCQkJdGhpcy5jb21iby5zZXRUZXh0KG1hcHBlZEJ5KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm8uc2V0VGV4dCgiIik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLm5vbk93bmluZ01hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5ub25Pd25pbmdNYXBwaW5nLmVBZGFwdGVycygpLmFkZCh0aGlzLm5vbk93bmluZ01hcHBpbmdMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5ub25Pd25pbmdNYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMubm9uT3duaW5nTWFwcGluZy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5ub25Pd25pbmdNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vbk93bmluZ01hcHBpbmdDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5vbk93bmluZ01hcHBpbmcuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU5PTl9PV05JTkdfTUFQUElOR19fTUFQUEVEX0JZKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZU1hcHBlZEJ5VGV4dCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVJFTEFUSU9OU0hJUF9NQVBQSU5HX19SRVNPTFZFRF9UQVJHRVRfRU5USVRZKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZUNob2ljZXMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjFlYzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLXsKLQlwcml2YXRlIElNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3M7Ci0JcHJpdmF0ZSBBZGFwdGVyIG1hcHBlZFN1cGVyY2xhc3NMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0JCi0JCi0JcHVibGljIE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLm1hcHBlZFN1cGVyY2xhc3NMaXN0ZW5lciA9IGJ1aWxkTWFwcGVkU3VwZXJjbGFzc0xpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZE1hcHBlZFN1cGVyY2xhc3NMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJbWFwcGVkU3VwZXJjbGFzc0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCQotLy8JCUxhYmVsIGFjY2Vzc1R5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLS8vCQlhY2Nlc3NUeXBlTGFiZWwuc2V0VGV4dChEYWxpVWlNZXNzYWdlcy5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlX2FjY2Vzc1R5cGUpOwotLy8JCXRoaXMuYWNjZXNzVHlwZUNvbWJvVmlld2VyID0gYnVpbGRBY2Nlc3NUeXBlQ29tYm8oY29tcG9zaXRlKTsKLS8vCQkvL2V2ZW50dWFsbHkgdGhpcyB3aWxsIGJlIGVuYWJsZWQgaWYgZWRpdGluZyB4bWwgaW5zdGVhZCBvZiBqYXZhCi0vLwkJdGhpcy5hY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotLy8JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotLy8JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotLy8JCXRoaXMuYWNjZXNzVHlwZUNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmFjY2Vzc1R5cGVDb21ib1ZpZXdlci5nZXRDb21ibygpLCBJRGFsaUhlbHBDb250ZXh0SWRzLkVOVElUWV9BQ0NFU1NfVFlQRSk7Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgQ29tYm9WaWV3ZXIgYnVpbGRBY2Nlc3NUeXBlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotLy8JCUNvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotLy8JCXZpZXdlci5hZGQoQWNjZXNzVHlwZS5WQUxVRVMudG9BcnJheSgpKTsKLS8vCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotLy8JCQkJaWYgKHBvcHVsYXRpbmcpIHsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0vLwkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0vLwkJCQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKFNldENvbW1hbmQuY3JlYXRlKGVkaXRpbmdEb21haW4sIHBlcnNpc3RlbnRUeXBlLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRQZXJzaXN0ZW50VHlwZV9BY2Nlc3NUeXBlKCksIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSk7Ci0vLwkJcmV0dXJuIHZpZXdlcjsKLS8vCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3QgbW9kZWwpIHsKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzID0gKElNYXBwZWRTdXBlcmNsYXNzKSBtb2RlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJCi0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLS8vCQl0aGlzLnBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyLmFkZExpc3RlbmVyKGdldFBlcnNpc3RlbnRUeXBlTGlzdGVuZXIoKSk7Ci0vLwkJdGhpcy5wZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotLy8JCWlmICh0aGlzLnBlcnNpc3RlbnRUeXBlICE9IG51bGwpewotLy8JCQl0aGlzLnBlcnNpc3RlbnRUeXBlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyKTsKLS8vCQkJdGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5yZW1vdmVMaXN0ZW5lcihnZXRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkpOwotLy8JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1hcHBlZFN1cGVyY2xhc3NDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCi0JfQotCQotLy8JcHJpdmF0ZSBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIGdldFBlcnNpc3RlbnRUeXBlTGlzdGVuZXIoKSB7Ci0vLwkJaWYgKHRoaXMucGVyc2lzdGVudFR5cGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0vLwkJCXRoaXMucGVyc2lzdGVudFR5cGVMaXN0ZW5lciA9IG5ldyBJTm90aWZ5Q2hhbmdlZExpc3RlbmVyKCkgewotLy8JCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0vLwkJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGVyc2lzdGVudFR5cGUuY2xhc3MpID09IE9ybVBhY2thZ2UuUEVSU0lTVEVOVF9UWVBFX19BQ0NFU1NfVFlQRSkgewotLy8JCQkJCQlmaW5hbCBBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgPSAoQWNjZXNzVHlwZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCQkJCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IGFjY2Vzc1R5cGUpIHsKLS8vCQkJCQkJCQkJYWNjZXNzVHlwZUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhY2Nlc3NUeXBlKSk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9KTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX07Ci0vLwkJfQotLy8JCXJldHVybiB0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXI7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvTWFueUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PbmVUb01hbnlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzMTczZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvTWFueUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE9uZVRvTWFueUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJT25lVG9NYW55IG9uZVRvTWFueTsKLQkKLQlwcml2YXRlIEVudW1Db21ib1ZpZXdlciBmZXRjaFR5cGVDb21ib1ZpZXdlcjsKLQkKLQlwcml2YXRlIFRhcmdldEVudGl0eUNob29zZXIgdGFyZ2V0RW50aXR5Q2hvb3NlcjsKLQkKLQlwcml2YXRlIE1hcHBlZEJ5Q29tYm8gbWFwcGVkQnlDb21ibzsKLQotCXByaXZhdGUgQ2FzY2FkZUNvbXBvc2l0ZSBjYXNjYWRlQ29tcG9zaXRlOwotCQotCXByaXZhdGUgT3JkZXJpbmdDb21wb3NpdGUgb3JkZXJpbmdDb21wb3NpdGU7Ci0KLQlwcml2YXRlIEpvaW5UYWJsZUNvbXBvc2l0ZSBqb2luVGFibGVDb21wb3NpdGU7Ci0JCi0JcHVibGljIE9uZVRvTWFueUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlDb250cm9sIGdlbmVyYWxDb250cm9sID0gYnVpbGRHZW5lcmFsQ29udHJvbChjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdlbmVyYWxDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbnRyb2wgam9pblRhYmxlQ29udHJvbCA9IGJ1aWxkSm9pblRhYmxlQ29udHJvbChjb21wb3NpdGUpOwotCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWpvaW5UYWJsZUNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXByaXZhdGUgQ29udHJvbCBidWlsZEdlbmVyYWxDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQotCQlHcmlkRGF0YSBncmlkRGF0YTsKLQkJCi0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRUYXJnZXRFbnRpdHlDaG9vc2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hMYWJlbChnZW5lcmFsQ29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEZldGNoVHlwZUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUpOwotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRNYXBwZWRCeUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMubWFwcGVkQnlDb21ibyA9IG5ldyBNYXBwZWRCeUNvbWJvKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMubWFwcGVkQnlDb21iby5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzLm1hcHBlZEJ5Q29tYm8uZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19NQVBQRURfQlkpOwotCQkKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlID0gbmV3IENhc2NhZGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQotCQl0aGlzLm9yZGVyaW5nQ29tcG9zaXRlID0gbmV3IE9yZGVyaW5nQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5vcmRlcmluZ0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCi0JCXJldHVybiBnZW5lcmFsQ29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRKb2luVGFibGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24oY29tcG9zaXRlLCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLQkgICAgc2VjdGlvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlKTsKLQotCQlDb21wb3NpdGUgam9pblRhYmxlQ2xpZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoam9pblRhYmxlQ2xpZW50KTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJam9pblRhYmxlQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlID0gbmV3IEpvaW5UYWJsZUNvbXBvc2l0ZShqb2luVGFibGVDbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMub25lVG9NYW55ID0gKElPbmVUb01hbnkpIG9iajsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5wb3B1bGF0ZShDb21tb25XaWRnZXRzLmJ1aWxkTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRmV0Y2hFbnVtSG9sZGVyKHRoaXMub25lVG9NYW55KSk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5wb3B1bGF0ZSh0aGlzLm9uZVRvTWFueSk7Ci0JCXRoaXMubWFwcGVkQnlDb21iby5wb3B1bGF0ZSh0aGlzLm9uZVRvTWFueSk7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLm9uZVRvTWFueSk7Ci0JCWlmICh0aGlzLm9uZVRvTWFueSAhPSBudWxsKSB7Ci0JCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLm9uZVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCQl0aGlzLm9yZGVyaW5nQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMub25lVG9NYW55KTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5vcmRlcmluZ0NvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8ucG9wdWxhdGUoKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMub3JkZXJpbmdDb21wb3NpdGUucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIuZGlzcG9zZSgpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8uZGlzcG9zZSgpOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMub3JkZXJpbmdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PbmVUb09uZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PbmVUb09uZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTZhMzUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9PbmVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5EZWZhdWx0VHJ1ZUJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnVtQ29tYm9WaWV3ZXIuRW51bUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXByaXZhdGUgSU9uZVRvT25lIG9uZVRvT25lOwotCQotCXByaXZhdGUgVGFyZ2V0RW50aXR5Q2hvb3NlciB0YXJnZXRFbnRpdHlDaG9vc2VyOwotCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgZmV0Y2hUeXBlQ29tYm9WaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBNYXBwZWRCeUNvbWJvIG1hcHBlZEJ5Q29tYm87Ci0KLQlwcml2YXRlIEVudW1Db21ib1ZpZXdlciBvcHRpb25hbENvbWJvVmlld2VyOwotCi0JcHJpdmF0ZSBDYXNjYWRlQ29tcG9zaXRlIGNhc2NhZGVDb21wb3NpdGU7Ci0KLQlwcml2YXRlIEpvaW5Db2x1bW5Db21wb3NpdGUgam9pbkNvbHVtbkNvbXBvc2l0ZTsKLQkJCi0JcHVibGljIE9uZVRvT25lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJT25lVG9PbmUgZ2V0T25lVG9PbmUoKSB7Ci0JCXJldHVybiB0aGlzLm9uZVRvT25lOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJQ29udHJvbCBnZW5lcmFsQ29udHJvbCA9IGJ1aWxkR2VuZXJhbENvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdlbmVyYWxDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JfQotCQotCXByaXZhdGUgQ29udHJvbCBidWlsZEdlbmVyYWxDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotLy8JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0JCQotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkVGFyZ2V0RW50aXR5Q2hvb3NlcihnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRGZXRjaExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hUeXBlQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29tbW9uV2lkZ2V0cy5idWlsZE1hcHBlZEJ5TGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvID0gbmV3IE1hcHBlZEJ5Q29tYm8oZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRPcHRpb25hbExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRFbnVtQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUgPSBuZXcgQ2FzY2FkZUNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5Db21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5qb2luQ29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsJCi0KLQkJcmV0dXJuIGdlbmVyYWxDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLm9uZVRvT25lID0gKElPbmVUb09uZSkgb2JqOwotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIucG9wdWxhdGUodGhpcy5vbmVUb09uZSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIucG9wdWxhdGUoQ29tbW9uV2lkZ2V0cy5idWlsZFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEVudW1Ib2xkZXIodGhpcy5vbmVUb09uZSkpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8ucG9wdWxhdGUodGhpcy5vbmVUb09uZSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5wb3B1bGF0ZShDb21tb25XaWRnZXRzLmJ1aWxkT3B0aW9uYWxIb2xkZXIodGhpcy5vbmVUb09uZSkpOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUucG9wdWxhdGUodGhpcy5vbmVUb09uZSk7Ci0JCXRoaXMuam9pbkNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLm9uZVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5qb2luQ29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIuZGlzcG9zZSgpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLmRpc3Bvc2UoKTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5qb2luQ29sdW1uQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjFiYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PcmRlcmluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE9yZGVyaW5nQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAgewotCi0JcHJpdmF0ZSBJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmc7Ci0JcHJpdmF0ZSBBZGFwdGVyIG1hcHBpbmdMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBub09yZGVyaW5nUmFkaW9CdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gY3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvbjsKLQkKLQlwcml2YXRlIElUZXh0Vmlld2VyIG9yZGVyaW5nVGV4dFZpZXdlcjsKLQkKLQkvLyBzaG9ydCBjaXJjdWl0IGZsYWcgZm9yIHVzZXIgdHlwaW5nCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0aW5nQ3VzdG9tT3JkZXJCeSA9IGZhbHNlOwotCQotCi0JcHVibGljIE9yZGVyaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLm1hcHBpbmdMaXN0ZW5lciA9IGJ1aWxkTWFwcGluZ0xpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkTWFwcGluZ0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJbWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJR3JvdXAgb3JkZXJCeUdyb3VwID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUdyb3VwKTsKLQkJb3JkZXJCeUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlvcmRlckJ5R3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChvcmRlckJ5R3JvdXAsIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZKTsKLQkJCi0KLQkJdGhpcy5ub09yZGVyaW5nUmFkaW9CdXR0b24gPSBidWlsZE5vT3JkZXJpbmdSYWRpb0J1dHRvbihvcmRlckJ5R3JvdXApOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLm5vT3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLS8vCQloZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLm5vT3JkZXJpbmdSYWRpb0J1dHRvbiwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfTk9fT1JERVJJTkcpOwotCi0KLQkJdGhpcy5wcmltYXJ5S2V5T3JkZXJpbmdSYWRpb0J1dHRvbiA9IGJ1aWxkUHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b24ob3JkZXJCeUdyb3VwKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5wcmltYXJ5S2V5T3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLS8vCQloZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnByaW1hcnlLZXlPcmRlcmluZ1JhZGlvQnV0dG9uLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9QUklNQVJZX0tFWV9PUkRFUklORyk7Ci0KLQkJdGhpcy5jdXN0b21PcmRlcmluZ1JhZGlvQnV0dG9uID0gYnVpbGRDdXN0b21PcmRlcmluZ1JhZGlvQnV0dG9uKG9yZGVyQnlHcm91cCk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuY3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLS8vCQloZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmN1c3RvbU9yZGVyaW5nUmFkaW9CdXR0b24sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX0NVU1RPTV9PUkRFUklORyk7Ci0KLQkJCi0JCXRoaXMub3JkZXJpbmdUZXh0Vmlld2VyID0gYnVpbGRPcmRlckJ5VGVzdFZpZXdlcihvcmRlckJ5R3JvdXApOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCXRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQlkpOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBidWlsZE5vT3JkZXJpbmdSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJcGFyZW50LCAKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PcmRlckJ5Q29tcG9zaXRlX25vT3JkZXJpbmcsIAotCQkJU1dULlJBRElPKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJT3JkZXJpbmdDb21wb3NpdGUudGhpcy5ub09yZGVyaW5nUmFkaW9CdXR0b25TZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQl2b2lkIG5vT3JkZXJpbmdSYWRpb0J1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKCEoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvL2lnbm9yZSBjYXNlIHdoZXJlIHJhZGlvIGJ1dHRvbiBpcyBkZXNlbGVjdGVkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMubWFwcGluZy5pc05vT3JkZXJpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMubWFwcGluZy5zZXROb09yZGVyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkUHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbigKLQkJCXBhcmVudCwgCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3JkZXJCeUNvbXBvc2l0ZV9wcmltYXJ5S2V5T3JkZXJpbmcsIAotCQkJU1dULlJBRElPKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJT3JkZXJpbmdDb21wb3NpdGUudGhpcy5wcmltYXJ5S2V5T3JkZXJpbmdSYWRpb0J1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0Jdm9pZCBwcmltYXJ5S2V5T3JkZXJpbmdSYWRpb0J1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKCEoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvL2lnbm9yZSBjYXNlIHdoZXJlIHJhZGlvIGJ1dHRvbiBpcyBkZXNlbGVjdGVkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgdGhpcy5tYXBwaW5nLmlzT3JkZXJCeVBrKCkpIHsKLQkJCXRoaXMubWFwcGluZy5zZXRPcmRlckJ5UGsoKTsKLQkJfQotCQlzZXRUZXh0Vmlld2VyRW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRDdXN0b21PcmRlcmluZ1JhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQlwYXJlbnQsIAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk9yZGVyQnlDb21wb3NpdGVfY3VzdG9tT3JkZXJpbmcsIAotCQkJU1dULlJBRElPKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJT3JkZXJpbmdDb21wb3NpdGUudGhpcy5jdXN0b21PcmRlcmluZ1JhZGlvQnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXZvaWQgY3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKCEoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvL2lnbm9yZSBjYXNlIHdoZXJlIHJhZGlvIGJ1dHRvbiBpcyBkZXNlbGVjdGVkCi0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0VGV4dFZpZXdlckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgSVRleHRWaWV3ZXIgYnVpbGRPcmRlckJ5VGVzdFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIFRleHRWaWV3ZXIgdGV4dFZpZXdlciA9IG5ldyBUZXh0Vmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KG5ldyBEb2N1bWVudCgpKTsKLQkJdGV4dFZpZXdlci5hZGRUZXh0TGlzdGVuZXIobmV3IElUZXh0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdlZChUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlvcmRlcmluZ1RleHRWaWV3ZXJDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdGV4dFZpZXdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9yZGVyaW5nVGV4dFZpZXdlckNoYW5nZWQoKSB7Ci0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBvcmRlckJ5VmFsdWUgPSB0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldCgpOwotCQlpZiAob3JkZXJCeVZhbHVlLmVxdWFscyh0aGlzLm1hcHBpbmcuZ2V0T3JkZXJCeSgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLnVwZGF0aW5nQ3VzdG9tT3JkZXJCeSA9IHRydWU7Ci0JCXRoaXMubWFwcGluZy5zZXRPcmRlckJ5KG9yZGVyQnlWYWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUZXh0Vmlld2VyRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuc2V0RWRpdGFibGUoZW5hYmxlZCk7Ci0JCXRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYXBwaW5nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU1VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXBvcHVsYXRlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0JCQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5tYXBwaW5nID0gKElNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcpIG9iajsKLQkJaWYgKHRoaXMubWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcG9wdWxhdGVPcmRlcmluZ1JhZGlvQnV0dG9ucygpOwkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlT3JkZXJpbmdSYWRpb0J1dHRvbnMoKTsJCQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMubWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcHBpbmcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMubWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMubWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMubWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVPcmRlcmluZ1JhZGlvQnV0dG9ucygpIHsKLQkJLy8gc2hvcnQgY2lyY3VpdCBpZiB1c2VyIGlzIHR5cGluZwotCQlpZiAodXBkYXRpbmdDdXN0b21PcmRlckJ5KSB7Ci0JCQl1cGRhdGluZ0N1c3RvbU9yZGVyQnkgPSBmYWxzZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHRoaXMubWFwcGluZy5pc05vT3JkZXJpbmcoKSkgewotCQkJdGhpcy5wcmltYXJ5S2V5T3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwkJCQotCQkJdGhpcy5jdXN0b21PcmRlcmluZ1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl0aGlzLm5vT3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlpZiAoISAiIi5lcXVhbHModGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKSkpIHsKLQkJCQl0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5tYXBwaW5nLmlzT3JkZXJCeVBrKCkpIHsKLQkJCXRoaXMuY3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5ub09yZGVyaW5nUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMucHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwkJCQotLy8JCQlTdHJpbmcgdmFsdWUgPSB0aGlzLm9yZGVyaW5nLmdldFZhbHVlKCk7Ci0vLwkJCWlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHModGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKSkpIHsKLS8vCQkJCXRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLmdldERvY3VtZW50KCkuc2V0KHZhbHVlKTsKLS8vCQkJfQotLy8JCQllbHNlIHsKLQkJCQlpZiAoISIiLmVxdWFscyh0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldCgpKSkgewotCQkJCQl0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7CQkJCQotCQkJCX0KLS8vCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMubWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpIHsKLQkJCXRoaXMubm9PcmRlcmluZ1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl0aGlzLnByaW1hcnlLZXlPcmRlcmluZ1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7CQkJCi0JCQl0aGlzLmN1c3RvbU9yZGVyaW5nUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5tYXBwaW5nLmdldE9yZGVyQnkoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHModGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKSkpIHsKLQkJCQl0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXREb2N1bWVudCgpLnNldCh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNldFRleHRWaWV3ZXJFbmFibGVkKHRoaXMubWFwcGluZy5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODZhYWIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkpvaW5Db2x1bW5zQ29tcG9zaXRlLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgT3ZlcnJpZGVzQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgTGlzdFZpZXdlciBsaXN0Vmlld2VyOwotCQotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JcHJpdmF0ZSBBZGFwdGVyIGVudGl0eUxpc3RlbmVyOwotCQotCXByaXZhdGUgSU92ZXJyaWRlIHNlbGVjdGVkT3ZlcnJpZGU7Ci0JcHJpdmF0ZSBBZGFwdGVyIG92ZXJyaWRlTGlzdGVuZXI7Ci0JCi0JcHJvdGVjdGVkIFBhZ2VCb29rIG92ZXJyaWRlUGFnZUJvb2s7Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgSm9pbkNvbHVtbnNDb21wb3NpdGUgam9pbkNvbHVtbnNDb21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0QnV0dG9uOwotCQotCXB1YmxpYyBPdmVycmlkZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmVudGl0eUxpc3RlbmVyID0gYnVpbGRFbnRpdHlMaXN0ZW5lcigpOwotCQl0aGlzLm92ZXJyaWRlTGlzdGVuZXIgPSBidWlsZE92ZXJyaWRlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkRW50aXR5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQllbnRpdHlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZE92ZXJyaWRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlvdmVycmlkZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlHcm91cCBhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cCgKLQkJCWNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGVPdmVycmlkZXMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJdGhpcy5saXN0Vmlld2VyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0Vmlld2VyKGF0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0JCXRoaXMubGlzdFZpZXdlci5nZXRMaXN0KCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5saXN0Vmlld2VyLmdldExpc3QoKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCi0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uID0gCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwLCAKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWREZWZhdWx0LCAKLQkJCQlTV1QuQ0hFQ0spOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZE92ZXJyaWRlRGVmYXVsdFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJCi0JCXRoaXMub3ZlcnJpZGVQYWdlQm9vayA9IGJ1aWxkT3ZlcnJpZGVQYWdlQm9vayhhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJdGhpcy5vdmVycmlkZVBhZ2VCb29rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUgPSBuZXcgSm9pbkNvbHVtbnNDb21wb3NpdGUodGhpcy5vdmVycmlkZVBhZ2VCb29rLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW4pOwotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBDb2x1bW5Db21wb3NpdGUodGhpcy5vdmVycmlkZVBhZ2VCb29rLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5vdmVycmlkZVBhZ2VCb29rLnNob3dQYWdlKHRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUuZ2V0Q29udHJvbCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhZ2VCb29rIGJ1aWxkT3ZlcnJpZGVQYWdlQm9vayhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZE92ZXJyaWRlRGVmYXVsdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW92ZXJyaWRlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3ZlcnJpZGVEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdmVycmlkZURlZmF1bHRCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWJvb2xlYW4gc2VsZWN0aW9uID0gdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24pIHsKLQkJCWlmIChnZXRTZWxlY3RlZE92ZXJyaWRlKCkgaW5zdGFuY2VvZiBJQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJCQlpbnQgaW5kZXggPSB0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCk7Ci0JCQkJSUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5lbnRpdHkuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGUoaW5kZXgpOwkJCQotCQkJCXRoaXMuZW50aXR5LmdldFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSh0aGlzLnNlbGVjdGVkT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCgoSUF0dHJpYnV0ZU92ZXJyaWRlKSB0aGlzLnNlbGVjdGVkT3ZlcnJpZGUpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgaW5kZXggPSB0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKTsKLQkJCQlJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5lbnRpdHkuY3JlYXRlQXNzb2NpYXRpb25PdmVycmlkZShpbmRleCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnNlbGVjdGVkT3ZlcnJpZGUuZ2V0TmFtZSgpOwotCQkJCXRoaXMuZW50aXR5LmdldFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQkJCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShuYW1lKTsKLQkJCQkvL2F0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUodGhpcy5hdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwkJCQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldFNlbGVjdGVkT3ZlcnJpZGUoKSBpbnN0YW5jZW9mIElBdHRyaWJ1dGVPdmVycmlkZSkgewotCQkJCXRoaXMuZW50aXR5LmdldFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSh0aGlzLnNlbGVjdGVkT3ZlcnJpZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUodGhpcy5zZWxlY3RlZE92ZXJyaWRlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIExpc3RWaWV3ZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGlzdFZpZXdlciBsaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0xhYmVsUHJvdmlkZXIoKSk7Ci0JCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzQ29udGVudFByb3ZpZGVyKCkpOwotCQkKLQkJbGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCW92ZXJyaWRlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGxpc3RWaWV3ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG92ZXJyaWRlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZmFsc2UpOwotCQkJdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZWxlY3RlZE92ZXJyaWRlID0gZ2V0U2VsZWN0ZWRPdmVycmlkZSgpOwotCQkJaWYgKHRoaXMuc2VsZWN0ZWRPdmVycmlkZSBpbnN0YW5jZW9mIElBdHRyaWJ1dGVPdmVycmlkZSkgewotCQkJCWJvb2xlYW4gc3BlY2lmaWVkT3ZlcnJpZGUgPSB0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jb250YWlucyh0aGlzLnNlbGVjdGVkT3ZlcnJpZGUpOwotCQkJCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbihzcGVjaWZpZWRPdmVycmlkZSk7Ci0JCQkJdGhpcy5vdmVycmlkZVBhZ2VCb29rLnNob3dQYWdlKHRoaXMuY29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUoKChJQXR0cmlidXRlT3ZlcnJpZGUpIHRoaXMuc2VsZWN0ZWRPdmVycmlkZSkuZ2V0Q29sdW1uKCkpOwotCQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoc3BlY2lmaWVkT3ZlcnJpZGUpOwotCQkJCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlib29sZWFuIHNwZWNpZmllZE92ZXJyaWRlID0gdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5jb250YWlucyh0aGlzLnNlbGVjdGVkT3ZlcnJpZGUpOwotCQkJCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbihzcGVjaWZpZWRPdmVycmlkZSk7Ci0JCQkJdGhpcy5vdmVycmlkZVBhZ2VCb29rLnNob3dQYWdlKHRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUuZ2V0Q29udHJvbCgpKTsKLQkJCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKG5ldyBKb2luQ29sdW1uc093bmVyKChJQXNzb2NpYXRpb25PdmVycmlkZSkgZ2V0U2VsZWN0ZWRPdmVycmlkZSgpKSk7Ci0JCQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKHNwZWNpZmllZE92ZXJyaWRlKTsKLQkJCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkvL1RPRE8gYWxzbyBkaXNwbGF5IGNvbHVtbiBuYW1lIHNvbWVob3cKLQkJCQlyZXR1cm4gKChJT3ZlcnJpZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJSUVudGl0eSBlbnRpdHkgPSAoSUVudGl0eSkgaW5wdXRFbGVtZW50OwotCQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKAotCQkJCQllbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkudG9BcnJheShuZXcgSU92ZXJyaWRlW2VudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCldKSwgCi0JCQkJCWVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElPdmVycmlkZSBnZXRTZWxlY3RlZE92ZXJyaWRlKCkgewotCQlyZXR1cm4gKElPdmVycmlkZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuZW50aXR5ID0gKElFbnRpdHkpIG9iajsKLQkJaWYgKHRoaXMuZW50aXR5ID09IG51bGwpIHsKLQkJCXRoaXMuc2VsZWN0ZWRPdmVycmlkZSA9IG51bGw7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmxpc3RWaWV3ZXIuZ2V0SW5wdXQoKSAhPSBlbnRpdHkpIHsKLQkJCXRoaXMubGlzdFZpZXdlci5zZXRJbnB1dChlbnRpdHkpOwotCQl9Ci0JCWlmICghdGhpcy5lbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAodGhpcy5saXN0Vmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCUlPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMuZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJCQl0aGlzLmxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG92ZXJyaWRlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPYmplY3Qgc2VsZWN0aW9uID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJCQkJdGhpcy5vdmVycmlkZVBhZ2VCb29rLnNob3dQYWdlKHRoaXMuY29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLmVuYWJsZVdpZGdldHModHJ1ZSk7Ci0JCQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKCgoSUF0dHJpYnV0ZU92ZXJyaWRlKSBzZWxlY3Rpb24pLmdldENvbHVtbigpKTsKLQkJCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLm92ZXJyaWRlUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkpOwotCQkJCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmVuYWJsZVdpZGdldHModHJ1ZSk7Ci0JCQkJCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUucG9wdWxhdGUobmV3IEpvaW5Db2x1bW5zT3duZXIoKElBc3NvY2lhdGlvbk92ZXJyaWRlKSBzZWxlY3Rpb24pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZmFsc2UpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5jb2x1bW5Db21wb3NpdGUuZG9Qb3B1bGF0ZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmRvUG9wdWxhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbnRpdHkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnRpdHkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuZW50aXR5TGlzdGVuZXIpOwotCQkJZm9yIChJT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiB0aGlzLmVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLmVBZGFwdGVycygpLmFkZCh0aGlzLm92ZXJyaWRlTGlzdGVuZXIpOwotCQkJfQkKLQkJCWZvciAoSU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogdGhpcy5lbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLmVBZGFwdGVycygpLmFkZCh0aGlzLm92ZXJyaWRlTGlzdGVuZXIpOwotCQkJfQkKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmVudGl0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLmVudGl0eS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5lbnRpdHlMaXN0ZW5lcik7Ci0JCQlmb3IgKElPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA6IHRoaXMuZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMub3ZlcnJpZGVMaXN0ZW5lcik7Ci0JCQl9CQotCQkJZm9yIChJT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiB0aGlzLmVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMub3ZlcnJpZGVMaXN0ZW5lcik7Ci0JCQl9CQotCQl9Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgZW50aXR5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSkgewotCQkJY2FzZSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX1NQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTIDoKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19TUEVDSUZJRURfQVNTT0NJQVRJT05fT1ZFUlJJREVTIDoKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19ERUZBVUxUX0FUVFJJQlVURV9PVkVSUklERVMgOgotCQkJY2FzZSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX0RFRkFVTFRfQVNTT0NJQVRJT05fT1ZFUlJJREVTIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAobGlzdFZpZXdlci5nZXRMaXN0KCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJbGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkgewotCQkJCQkoKElPdmVycmlkZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLmVBZGFwdGVycygpLmFkZCh0aGlzLm92ZXJyaWRlTGlzdGVuZXIpOwotCQkJCQlmaW5hbCBPYmplY3QgbmV3VmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJKChJT3ZlcnJpZGUpIG5ld1ZhbHVlKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5vdmVycmlkZUxpc3RlbmVyKTsKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAobGlzdFZpZXdlci5nZXRMaXN0KCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJbGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3VmFsdWUpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkpIHsKLQkJCQkJTGlzdDxJT3ZlcnJpZGU+IGFkZGVkTGlzdCA9IChMaXN0PElPdmVycmlkZT4pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3IgKElPdmVycmlkZSBvdmVycmlkZSA6IGFkZGVkTGlzdCkgewotCQkJCQkJb3ZlcnJpZGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMub3ZlcnJpZGVMaXN0ZW5lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUpIHsKLQkJCQkJKChJT3ZlcnJpZGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5vdmVycmlkZUxpc3RlbmVyKTsJCQkJCi0JCQkJfQotCQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCQkJTGlzdDxJT3ZlcnJpZGU+IHJlbW92ZWRMaXN0ID0gKExpc3Q8SU92ZXJyaWRlPikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvciAoSU92ZXJyaWRlIG92ZXJyaWRlIDogcmVtb3ZlZExpc3QpIHsKLQkJCQkJCW92ZXJyaWRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLm92ZXJyaWRlTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3ZlcnJpZGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElPdmVycmlkZS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JT1ZFUlJJREVfX05BTUUgOgotCQkJCWZpbmFsIElPdmVycmlkZSBvdmVycmlkZSA9IChJT3ZlcnJpZGUpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCU92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmxpc3RWaWV3ZXIudXBkYXRlKG92ZXJyaWRlLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5jb2x1bW5Db21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQotCXZvaWQgYWRkSm9pbkNvbHVtbigpIHsKLQkJSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyBkaWFsb2cgPSBuZXcgSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCAoSUFzc29jaWF0aW9uT3ZlcnJpZGUpIGdldFNlbGVjdGVkT3ZlcnJpZGUoKSk7Ci0JCXRoaXMuYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9ICgoSUFzc29jaWF0aW9uT3ZlcnJpZGUpIGdldFNlbGVjdGVkT3ZlcnJpZGUoKSkuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCk7Ci0JCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoKElBc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRTZWxlY3RlZE92ZXJyaWRlKCkpLmNyZWF0ZUpvaW5Db2x1bW4oaW5kZXgpOwotCQkoKElBc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRTZWxlY3RlZE92ZXJyaWRlKCkpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuYWRkKGpvaW5Db2x1bW4pOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0Jdm9pZCBlZGl0Sm9pbkNvbHVtbihJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nID0gbmV3IEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgam9pbkNvbHVtbik7Ci0JCWVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2csIGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW5Gcm9tRGlhbG9nKEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nLCBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJZWRpdEpvaW5Db2x1bW5EaWFsb2dPa2QoZGlhbG9nLCBqb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW5EaWFsb2dPa2QoSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyBkaWFsb2csIElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCk7Ci0JCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRpYWxvZy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCWlmIChkaWFsb2cuaXNEZWZhdWx0TmFtZVNlbGVjdGVkKCkpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgfHwgIWpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobmFtZSk7Ci0JCX0KLQkJCi0JCWlmIChkaWFsb2cuaXNEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpICE9IG51bGwpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkuZXF1YWxzKHJlZmVyZW5jZWRDb2x1bW5OYW1lKSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5zT3duZXIgZXh0ZW5kcyBKcGFFT2JqZWN0IGltcGxlbWVudHMgT3duZXIgewotCQkKLQkJSUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZTsKLQkJCi0JCXB1YmxpYyBKb2luQ29sdW1uc093bmVyKElBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKCkgewotCQkJT3ZlcnJpZGVzQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbigpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJSm9pbkNvbHVtbiBjcmVhdGVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5jcmVhdGVKb2luQ29sdW1uKGluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8SUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdDxJSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNGZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQVNTT0NJQVRJT05fT1ZFUlJJREVfX1NQRUNJRklFRF9KT0lOX0NPTFVNTlM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBvd25pbmdGZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCU92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmVkaXRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZTsKLQkJfQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FhOTY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAgICAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZzxJUHJpbWFyeUtleUpvaW5Db2x1bW4+IHsKLQotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JCi0JUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBJRW50aXR5IGVudGl0eSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQl9Ci0KLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQsIElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgam9pbkNvbHVtbik7Ci0JCXRoaXMuZW50aXR5ID0gKElFbnRpdHkpIGpvaW5Db2x1bW4uZUNvbnRhaW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eS5wcmltYXJ5RGJUYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5LnBhcmVudEVudGl0eSgpLnByaW1hcnlEYlRhYmxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYTIyMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAgICAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZzxJUHJpbWFyeUtleUpvaW5Db2x1bW4+IHsKLQotCXByaXZhdGUgSVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCQotCVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocGFyZW50LCBqb2luQ29sdW1uKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IChJU2Vjb25kYXJ5VGFibGUpIGpvaW5Db2x1bW4uZUNvbnRhaW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlLmRiVGFibGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlLnR5cGVNYXBwaW5nKCkucHJpbWFyeURiVGFibGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhNzUyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJRW50aXR5IGVudGl0eTsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgZW50aXR5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIHBrSm9pbkNvbHVtbkxpc3RlbmVyOwotCQotCUxpc3RWaWV3ZXIgcGtKb2luQ29sdW1uc0xpc3RWaWV3ZXI7Ci0KLQlwcml2YXRlIEdyb3VwIHBrSm9pbkNvbHVtbnNHcm91cDsKLQlCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveDsKLQlwcml2YXRlIEJ1dHRvbiBwa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uOwotCQotCQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmVudGl0eUxpc3RlbmVyID0gYnVpbGRFbnRpdHlMaXN0ZW5lcigpOwotCQl0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyID0gYnVpbGRQa0pvaW5Db2x1bW5MaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRFbnRpdHlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWVudGl0eUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUGtKb2luQ29sdW1uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlwa0pvaW5Db2x1bW5DaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQljb21wb3NpdGUsIAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIAotCQkJU1dULkNIRUNLKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5lbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCQkJCi0JCQkJCUlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5lbnRpdHkuY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQocGtKb2luQ29sdW1uKTsKLQkJCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuZW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCA9IAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKAotCQkJCWNvbXBvc2l0ZSwgCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIodGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMpOwotCQkKLQkJQnV0dG9uIGFkZEpvaW5Db2x1bW5CdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMucGtKb2luQ29sdW1uc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWFkZEpvaW5Db2x1bW5CdXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2FkZCk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYWRkSm9pbkNvbHVtbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYWRkSm9pbkNvbHVtbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCwgU1dULk5PTkUpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0KTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX0pOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5wa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCwgU1dULk5PTkUpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3JlbW92ZSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlyZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNFbmFibGVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKXsKLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiAoKElFbnRpdHkpIGlucHV0RWxlbWVudCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSVByaW1hcnlLZXlKb2luQ29sdW1uKSBlbGVtZW50OwotCQkJCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuZW50aXR5LmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpID8KLQkJCQkJYnVpbGRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbikKLQkJCQk6Ci0JCQkJCWJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JU3RyaW5nIGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MYWJlbChJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQl9Ci0JCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSxqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQkJCX0KLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQkKLQkJfQotCX0KLQotCQotCXZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCB0aGlzLmVudGl0eSk7Ci0JCWFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uRnJvbURpYWxvZyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRpYWxvZy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQkJSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSB0aGlzLmVudGl0eS5jcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7Ci0JCQl0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoam9pbkNvbHVtbik7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobmFtZSk7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRTZWxlY3RlZEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSVByaW1hcnlLZXlKb2luQ29sdW1uKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCXZvaWQgZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldFNlbGVjdGVkSm9pbkNvbHVtbigpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgam9pbkNvbHVtbik7Ci0JCWVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2csIGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW5Gcm9tRGlhbG9nKFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZywgSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQllZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChkaWFsb2csIGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2csIElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdE5hbWVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0JCQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uTmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvciBpID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmVudGl0eS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXZvaWQgdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiBncm91cEVuYWJsZWRTdGF0ZSA9IHRoaXMuZW50aXR5LmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCWVuYWJsZUdyb3VwKHRoaXMucGtKb2luQ29sdW1uc0dyb3VwLCBncm91cEVuYWJsZWRTdGF0ZSk7Ci0KLQkJdGhpcy5wa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZ3JvdXBFbmFibGVkU3RhdGUgJiYgISgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuaXNFbXB0eSgpKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRFbmFibGVkKGdyb3VwRW5hYmxlZFN0YXRlICYmICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuc2l6ZSgpID09IDEpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5hYmxlR3JvdXAoR3JvdXAgZ3JvdXAsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlncm91cC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwLmdldENoaWxkcmVuKCkubGVuZ3RoOyBpKyspIHsKLQkJCWdyb3VwLmdldENoaWxkcmVuKClbaV0uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQkKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmVudGl0eSA9IChJRW50aXR5KSBvYmo7Ci0JCWlmICh0aGlzLmVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldElucHV0KG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldElucHV0KHRoaXMuZW50aXR5KTsKLQkJCi0KLQkJdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuZW50aXR5LmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbnRpdHkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnRpdHkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuZW50aXR5TGlzdGVuZXIpOwotCQkJZm9yIChJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogdGhpcy5lbnRpdHkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKLQkJCQlwa0pvaW5Db2x1bW4uZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGtKb2luQ29sdW1uTGlzdGVuZXIpOwotCQkJfQotCQkJLy90aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwkJCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbnRpdHkgIT0gbnVsbCkgewotCQkJLy90aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJZm9yIChJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogdGhpcy5lbnRpdHkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKLQkJCQlwa0pvaW5Db2x1bW4uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucGtKb2luQ29sdW1uTGlzdGVuZXIpOwotCQkJfQotCQkJdGhpcy5lbnRpdHkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuZW50aXR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVudGl0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX1NQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkgewotCQkJCSgoSVByaW1hcnlLZXlKb2luQ29sdW1uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGtKb2luQ29sdW1uTGlzdGVuZXIpOwotCQkJfQotCQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUpIHsKLQkJCQkoKElQcmltYXJ5S2V5Sm9pbkNvbHVtbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyKTsJCQkJCi0JCQl9Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCW92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGVudGl0eS5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQkJCQkJdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGtKb2luQ29sdW1uQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19TUEVDSUZJRURfTkFNRQotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQWJzdHJhY3RKb2luQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9KT0lOX0NPTFVNTl9fU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX0RFRkFVTFRfTkFNRQotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQWJzdHJhY3RKb2luQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9KT0lOX0NPTFVNTl9fREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZjNTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIHNlY29uZGFyeVRhYmxlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIHBrSm9pbkNvbHVtbkxpc3RlbmVyOwotCQotCUxpc3RWaWV3ZXIgcGtKb2luQ29sdW1uc0xpc3RWaWV3ZXI7Ci0KLQlwcml2YXRlIEdyb3VwIHBrSm9pbkNvbHVtbnNHcm91cDsKLQlCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveDsKLQlwcml2YXRlIEJ1dHRvbiBwa0pvaW5Db2x1bW5zQWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcGtKb2luQ29sdW1uc0VkaXRCdXR0b247Ci0JCi0JCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlTGlzdGVuZXIgPSBidWlsZFNlY29uZGFyeVRhYmxlTGlzdGVuZXIoKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5MaXN0ZW5lciA9IGJ1aWxkUGtKb2luQ29sdW1uTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkU2Vjb25kYXJ5VGFibGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXNlY29uZGFyeVRhYmxlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRQa0pvaW5Db2x1bW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXBrSm9pbkNvbHVtbkNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbigKLQkJCWNvbXBvc2l0ZSwgCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucywgCi0JCQlTV1QuQ0hFQ0spOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLnRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLnRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCQkJCi0JCQkJCUlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLnRoaXMuc2Vjb25kYXJ5VGFibGUuY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUudGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQocGtKb2luQ29sdW1uKTsKLQkJCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS50aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCA9IAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKAotCQkJCWNvbXBvc2l0ZSwgCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIodGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMpOwotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQWRkQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCwgU1dULk5PTkUpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNBZGRCdXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2FkZCk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNBZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIFNXVC5OT05FKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdCk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0VkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIFNXVC5OT05FKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9yZW1vdmUpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJU2Vjb25kYXJ5VGFibGUpIGlucHV0RWxlbWVudCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoSVByaW1hcnlLZXlKb2luQ29sdW1uKSBlbGVtZW50OwotCQkJCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS50aGlzLnNlY29uZGFyeVRhYmxlLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpID8KLQkJCQkJYnVpbGRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbikKLQkJCQk6Ci0JCQkJCWJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JU3RyaW5nIGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MYWJlbChJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQl9Ci0JCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSxqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQkJCX0KLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQkKLQkJfQotCX0KLQotCQotCXZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHRoaXMuc2Vjb25kYXJ5VGFibGUpOwotCQlhZGRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2cpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZykgewotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWludCBpbmRleCA9IHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpOwotCQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCk7Ci0JCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCUlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5zZWNvbmRhcnlUYWJsZS5jcmVhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbmRleCk7Ci0JCQl0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChqb2luQ29sdW1uKTsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVByaW1hcnlLZXlKb2luQ29sdW1uIGdldFNlbGVjdGVkSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChJUHJpbWFyeUtleUpvaW5Db2x1bW4pICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCi0Jdm9pZCBlZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCUlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0U2VsZWN0ZWRKb2luQ29sdW1uKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGpvaW5Db2x1bW4pOwotCQllZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nLCBJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWVkaXRKb2luQ29sdW1uRGlhbG9nT2tkKGRpYWxvZywgam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRGlhbG9nT2tkKFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2csIElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdE5hbWVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0JCQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uTmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvciBpID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZShpLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jdm9pZCB1cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNFbmFibGVtZW50KCkgewotCQlib29sZWFuIGdyb3VwRW5hYmxlZFN0YXRlID0gdGhpcy5zZWNvbmRhcnlUYWJsZS5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQllbmFibGVHcm91cCh0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCwgZ3JvdXBFbmFibGVkU3RhdGUpOwotCi0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGdyb3VwRW5hYmxlZFN0YXRlICYmICEoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmlzRW1wdHkoKSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0RW5hYmxlZChncm91cEVuYWJsZWRTdGF0ZSAmJiAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnNpemUoKSA9PSAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUdyb3VwKEdyb3VwIGdyb3VwLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJZ3JvdXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cC5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQlncm91cC5nZXRDaGlsZHJlbigpW2ldLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0JCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IChJU2Vjb25kYXJ5VGFibGUpIG9iajsKLQkJaWYgKHRoaXMuc2Vjb25kYXJ5VGFibGUgPT0gbnVsbCkgewotCQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dCh0aGlzLnNlY29uZGFyeVRhYmxlKTsKLQkJCi0KLQkJdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuc2Vjb25kYXJ5VGFibGUuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnNlY29uZGFyeVRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuc2Vjb25kYXJ5VGFibGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuc2Vjb25kYXJ5VGFibGVMaXN0ZW5lcik7Ci0JCQlmb3IgKElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiB0aGlzLnNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJcGtKb2luQ29sdW1uLmVBZGFwdGVycygpLmFkZCh0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnNlY29uZGFyeVRhYmxlICE9IG51bGwpIHsKLQkJCWZvciAoSVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA6IHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpIHsKLQkJCQlwa0pvaW5Db2x1bW4uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucGtKb2luQ29sdW1uTGlzdGVuZXIpOwotCQkJfQotCQkJdGhpcy5zZWNvbmRhcnlUYWJsZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5zZWNvbmRhcnlUYWJsZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZWNvbmRhcnlUYWJsZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJU2Vjb25kYXJ5VGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVNFQ09OREFSWV9UQUJMRV9fU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUykgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKSB7Ci0JCQkJKChJUHJpbWFyeUtleUpvaW5Db2x1bW4pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5wa0pvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSkgewotCQkJCSgoSVByaW1hcnlLZXlKb2luQ29sdW1uKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucGtKb2luQ29sdW1uTGlzdGVuZXIpOwkJCQkKLQkJCX0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5zZXRTZWxlY3Rpb24oc2Vjb25kYXJ5VGFibGUuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JCQkJCXVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0VuYWJsZW1lbnQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBrSm9pbkNvbHVtbkNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJTmFtZWRDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU5BTUVEX0NPTFVNTl9fU1BFQ0lGSUVEX05BTUUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Sm9pbkNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfSk9JTl9DT0xVTU5fX1NQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19ERUZBVUxUX05BTUUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Sm9pbkNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfSk9JTl9DT0xVTU5fX0RFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNBZGRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2NoZW1hQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2NoZW1hQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1NWMyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NjaGVtYUNvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFDb21ibyBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBJVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDYWNoaW5nIHRoZSBjb25uZWN0aW9uUHJvZmlsZSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZSBsaXN0ZW5lci4gSWYgdGhlCi0JICogY2FjaGVkIHRhYmxlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsIHRoZW4gd2Ugbm8gbG9uZ2VyCi0JICogaGF2ZSBhY2Nlc3MgdG8gdGhlIHBhcmVudCBhbmQgY2Fubm90IGZpbmQgdGhlIGNvbm5lY3Rpb25Qcm9maWxlCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JcHVibGljIFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkVGFibGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCVNjaGVtYUNvbWJvLnRoaXMuc2NoZW1hQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb21ibygpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVNjaGVtYUNvbWJvLnRoaXMucG9wdWxhdGVTaGVtYUNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZGF0YWJhc2UgPT0gU2NoZW1hQ29tYm8udGhpcy5nZXREYXRhYmFzZSgpKSB7Ci0JCQkJCQkJaWYgKCFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCVNjaGVtYUNvbWJvLnRoaXMucG9wdWxhdGVTaGVtYUNvbWJvKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBTY2hlbWEgc2NoZW1hKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoc2NoZW1hID09IFNjaGVtYUNvbWJvLnRoaXMuZ2V0VGFibGVTY2hlbWEoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBUYWJsZSB0YWJsZSkgewotCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQl0aGlzLmNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJdGhpcy5jb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgc2NoZW1hVGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNjaGVtYVRleHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNjaGVtYVRleHQgPSBudWxsOwotCQkJCQlpZiAoU2NoZW1hQ29tYm8udGhpcy50YWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsIHx8IFNjaGVtYUNvbWJvLnRoaXMudGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHNjaGVtYVRleHQgIT0gbnVsbCAmJiBjb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgc2NoZW1hVGV4dC5lcXVhbHMoY29tYm8uZ2V0SXRlbSgwKSkpIHsKLQkJCQkJc2NoZW1hVGV4dCA9IG51bGw7Ci0JCQkJfQotCQkJCWlmIChTY2hlbWFDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpID09IG51bGwgJiYgc2NoZW1hVGV4dCAhPSBudWxsKSB7Ci0JCQkJCVNjaGVtYUNvbWJvLnRoaXMudGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKHNjaGVtYVRleHQpOwotCQkJCX0KLQkJCQlpZiAoU2NoZW1hQ29tYm8udGhpcy50YWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSAhPSBudWxsICYmICFTY2hlbWFDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpLmVxdWFscyhzY2hlbWFUZXh0KSkgewotCQkJCQlTY2hlbWFDb21iby50aGlzLnRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShzY2hlbWFUZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNjaGVtYUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfU0NIRU1BKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2NoZW1hTmFtZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fREVGQVVMVF9TQ0hFTUEpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVNjaGVtYUNvbWJvLnRoaXMucG9wdWxhdGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fREVGQVVMVF9DQVRBTE9HKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fU1BFQ0lGSUVEX0NBVEFMT0cpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVNjaGVtYUNvbWJvLnRoaXMucG9wdWxhdGVTaGVtYUNvbWJvKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMudGFibGUgPSAoSVRhYmxlKSBvYmo7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMucG9wdWxhdGVTaGVtYUNvbWJvKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMucG9wdWxhdGVTaGVtYUNvbWJvKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMudGFibGUuZ2V0SnBhUHJvamVjdCgpLmNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU2hlbWFDb21ibygpIHsKLQkJaWYgKHRoaXMudGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMucG9wdWxhdGVEZWZhdWx0U2NoZW1hTmFtZSgpOwotCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlKDEsIHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxKTsKLQkJCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQkJaWYgKGRhdGFiYXNlICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvcjxTdHJpbmc+IHNjaGVtYXRhID0gZGF0YWJhc2Uuc2NoZW1hTmFtZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoc2NoZW1hdGEpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQl0aGlzLmNvbWJvLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCX0KLQkJdGhpcy5wb3B1bGF0ZVNjaGVtYU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlZmF1bHRTY2hlbWFOYW1lKCkgewotCQlTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWUgPSB0aGlzLnRhYmxlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJY29tYm8uc2V0SXRlbSgwLCBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdFNjaGVtYU5hbWUpKTsKLQkJaWYgKHNlbGVjdGlvbkluZGV4ID09IDApIHsKLQkJCWNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQljb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNjaGVtYU5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgc2NoZW1hTmFtZSA9IHRoaXMudGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCVN0cmluZyBkZWZhdWx0U2NoZW1hTmFtZSA9IHRoaXMudGFibGUuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlpZiAoIVN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc2NoZW1hTmFtZSkpIHsKLQkJCWlmICghdGhpcy5jb21iby5nZXRUZXh0KCkuZXF1YWxzKHNjaGVtYU5hbWUpKSB7Ci0JCQkJdGhpcy5jb21iby5zZXRUZXh0KHNjaGVtYU5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLmNvbWJvLmdldFRleHQoKS5lcXVhbHMoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRTY2hlbWFOYW1lKSkpIHsKLQkJCQl0aGlzLmNvbWJvLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDQ29tYm8gZ2V0Q29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBnZXRDb21ibygpOwotCX0KLQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0VGFibGVTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy50YWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJdGhpcy50YWJsZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5saXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMudGFibGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMubGlzdGVuZXIpOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiZTA3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgICAgIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JLy9pZiBjcmVhdGluZyBhIG5ldyBKb2luQ29sdW1uLCB0aGlzIHdpbGwgYmUgbnVsbCwgCi0JLy9zcGVjaWZ5IHRoZSBKb2luQ29sdW1uT3duZXIgaW5zdGVhZCBpbiB0aGUgYXBwcm9wcmlhdGUgY29uc3RydXRvcgotCXByaXZhdGUgSVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JCi0JcHJvdGVjdGVkIENvbWJvIG5hbWVDb21ibzsKLQlwcm90ZWN0ZWQgQ29tYm8gY2F0YWxvZ0NvbWJvOwotCXByb3RlY3RlZCBDb21ibyBzY2hlbWFDb21ibzsKLQkKLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRTY2hlbWE7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRDYXRhbG9nOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0U2NoZW1hU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRDYXRhbG9nU2VsZWN0ZWQ7Ci0JCi0JU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBJRW50aXR5IGVudGl0eSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQl9Ci0KLQlTZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwgSUVudGl0eSBlbnRpdHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlOwotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KGdldFRpdGxlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRTZWNvbmRhcnlUYWJsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19uYW1lKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJdGhpcy5uYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMubmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwb3B1bGF0ZU5hbWVDb21ibygpOwotCQotCQlMYWJlbCBjYXRhbG9nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWNhdGFsb2dMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJY2F0YWxvZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJdGhpcy5jYXRhbG9nQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCi0JCUxhYmVsIHNjaGVtYUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlzY2hlbWFMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlzY2hlbWFMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMuc2NoZW1hQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMuc2NoZW1hQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJSUpwYVByb2plY3QgcHJvamVjdCA9ICh0aGlzLnNlY29uZGFyeVRhYmxlID09IG51bGwpID8gdGhpcy5lbnRpdHkuZ2V0SnBhUHJvamVjdCgpIDogdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRKcGFQcm9qZWN0KCk7Ci0JCXJldHVybiBwcm9qZWN0LmNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0VGFibGVTY2hlbWEoKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQlpZiAoZGF0YWJhc2UgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuc2Vjb25kYXJ5VGFibGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBkYXRhYmFzZS5zY2hlbWFOYW1lZCh0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCX0KLQkJCXJldHVybiBkYXRhYmFzZS5zY2hlbWFOYW1lZCh0aGlzLmVudGl0eS5nZXRUYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOYW1lQ29tYm8oKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFRhYmxlU2NoZW1hKCk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJSXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMgPSBzY2hlbWEudGFibGVOYW1lcygpOwotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KCB0YWJsZXMpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLm5hbWVDb21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZ2V0U2Vjb25kYXJ5VGFibGUoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2Vjb25kYXJ5VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXRoaXMubmFtZUNvbWJvLnNldFRleHQoZ2V0U2Vjb25kYXJ5VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTY2hlbWFDb21ibygpIHsKLQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkgIT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWFDb21iby5hZGQoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRTY2hlbWEsIGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKSk7Ci0JCX0KLQkJCi0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQkKLQkJaWYgKGRhdGFiYXNlICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gc2NoZW1hdGEgPSBkYXRhYmFzZS5zY2hlbWFOYW1lcygpOwotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KHNjaGVtYXRhKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5zY2hlbWFDb21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZ2V0U2Vjb25kYXJ5VGFibGUoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2Vjb25kYXJ5VGFibGUoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zY2hlbWFDb21iby5zZXRUZXh0KGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zY2hlbWFDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDYXRhbG9nQ29tYm8oKSB7Ci0JCWlmIChnZXRTZWNvbmRhcnlUYWJsZSgpICE9IG51bGwpIHsKLQkJCXRoaXMuY2F0YWxvZ0NvbWJvLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2csIGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSkpOwotCQl9Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQkKLQkJaWYgKGRhdGFiYXNlICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gY2F0YWxvZ3MgPSBkYXRhYmFzZS5jYXRhbG9nTmFtZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydChjYXRhbG9ncyk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuY2F0YWxvZ0NvbWJvLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChnZXRTZWNvbmRhcnlUYWJsZSgpICE9IG51bGwpIHsKLQkJCWlmIChnZXRTZWNvbmRhcnlUYWJsZSgpLmdldFNwZWNpZmllZENhdGFsb2coKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jYXRhbG9nQ29tYm8uc2V0VGV4dChnZXRTZWNvbmRhcnlUYWJsZSgpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNhdGFsb2dDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotCXByb3RlY3RlZCBDb21ibyBnZXROYW1lQ29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVDb21ibzsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGdldFNjaGVtYUNvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFDb21ibzsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGdldENhdGFsb2dDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMuY2F0YWxvZ0NvbWJvOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVNlY29uZGFyeVRhYmxlIGdldFNlY29uZGFyeVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkQ2F0YWxvZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRTY2hlbWE7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdFNjaGVtYVNlbGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hU2VsZWN0ZWQ7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdENhdGFsb2dTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2dTZWxlY3RlZDsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQl0aGlzLnNlbGVjdGVkTmFtZSA9IHRoaXMubmFtZUNvbWJvLmdldFRleHQoKTsKLQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuc2NoZW1hQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYS5lcXVhbHMoIiIpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gbnVsbDsKLQkJfQotCQl0aGlzLnNlbGVjdGVkQ2F0YWxvZyA9IHRoaXMuY2F0YWxvZ0NvbWJvLmdldFRleHQoKTsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRDYXRhbG9nLmVxdWFscygiIikpIHsKLQkJCXRoaXMuc2VsZWN0ZWRDYXRhbG9nID0gbnVsbDsKLQkJfQotCQl0aGlzLmRlZmF1bHRTY2hlbWFTZWxlY3RlZCA9IHRoaXMuc2NoZW1hQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nU2VsZWN0ZWQgPSB0aGlzLmNhdGFsb2dDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDA7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmYxNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotLy9UT0RPIGhhbmRsZSB4bWwsIGhvdyB0byBoYW5kbGUgdmlydHVhbCBzZWNvbmRhcnlUYWJsZXMsIGFkZGluZyB0aGVtIHRvIHhtbCwgYXJlIHRoZXkgb3ZlcnJpZGVuLCBldGM/PwotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJRW50aXR5IGVudGl0eTsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgZW50aXR5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIHNlY29uZGFyeVRhYmxlTGlzdGVuZXI7Ci0JCi0JTGlzdFZpZXdlciBzZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyOwotCi0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCQotCXByaXZhdGUgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSBwa0pvaW5Db2x1bW5zQ29tcG9zaXRlOwotCQotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmVudGl0eUxpc3RlbmVyID0gYnVpbGRFbnRpdHlMaXN0ZW5lcigpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlTGlzdGVuZXIgPSBidWlsZFNlY29uZGFyeVRhYmxlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkRW50aXR5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQllbnRpdHlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZFNlY29uZGFyeVRhYmxlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlzZW9uY2FyeVRhYmxlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkKLQkJQ29tcG9zaXRlIHNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQotCQl0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIgPSBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIoc2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJLy9QbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5nZXRMaXN0KCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUyk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJdGhpcy5hZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5hZGRCdXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2FkZCk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJdGhpcy5hZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMuYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRTZWNvbmRhcnlUYWJsZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXRoaXMuZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0aGlzLmVkaXRCdXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2VkaXQpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXRoaXMuZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5lZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllZGl0U2Vjb25kYXJ5VGFibGUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdGhpcy5yZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5yZW1vdmVCdXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3JlbW92ZSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCXRoaXMucmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLnJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlU2Vjb25kYXJ5VGFibGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNDb21wb3NpdGUgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZShjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxpc3RWaWV3ZXIgbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TGFiZWxQcm92aWRlcigpKTsKLQkJbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotCQkKLQkJbGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUVuYWJsZW1lbnQoKTsKLQkJCQlzZWNvbmRhcnlUYWJsZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBsaXN0Vmlld2VyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZWNvbmRhcnlUYWJsZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmlzRW1wdHkoKSkgewotCQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJSVNlY29uZGFyeVRhYmxlIHNlbGVjdGVkU2Vjb25kYXJ5VGFibGUgPSBnZXRTZWxlY3RlZFNlY29uZGFyeVRhYmxlKCk7Ci0JCQl0aGlzLnBrSm9pbkNvbHVtbnNDb21wb3NpdGUucG9wdWxhdGUoc2VsZWN0ZWRTZWNvbmRhcnlUYWJsZSk7Ci0JCQl0aGlzLnBrSm9pbkNvbHVtbnNDb21wb3NpdGUuZW5hYmxlV2lkZ2V0cyh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKXsKLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiAoKElFbnRpdHkpIGlucHV0RWxlbWVudCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCS8vVE9ETyBkaXNwbGF5IGEgcXVhbGlmaWVkIG5hbWUgaW5zdGVhZAotCQkJCUlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IChJU2Vjb25kYXJ5VGFibGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0Jdm9pZCBhZGRTZWNvbmRhcnlUYWJsZSgpIHsKLQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHRoaXMuZW50aXR5KTsKLQkJYWRkU2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKGRpYWxvZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJaW50IGluZGV4ID0gdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpOwotCQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCk7Ci0JCQlTdHJpbmcgY2F0YWxvZyA9IGRpYWxvZy5nZXRTZWxlY3RlZENhdGFsb2coKTsKLQkJCVN0cmluZyBzY2hlbWEgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRTY2hlbWEoKTsKLQkJCUlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHRoaXMuZW50aXR5LmNyZWF0ZVNlY29uZGFyeVRhYmxlKGluZGV4KTsKLQkJCXRoaXMuZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLmFkZChzZWNvbmRhcnlUYWJsZSk7Ci0JCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nKTsKLQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShzY2hlbWEpOwotCQkJCi0JCQl0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlY29uZGFyeVRhYmxlKSk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBlZGl0U2Vjb25kYXJ5VGFibGUoKSB7Ci0JCUlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldFNlbGVjdGVkU2Vjb25kYXJ5VGFibGUoKTsKLQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHNlY29uZGFyeVRhYmxlLCB0aGlzLmVudGl0eSk7Ci0JCWVkaXRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coZGlhbG9nLCBzZWNvbmRhcnlUYWJsZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0U2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKFNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZywgSVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJZWRpdFNlY29uZGFyeVRhYmxlRGlhbG9nT2tkKGRpYWxvZywgc2Vjb25kYXJ5VGFibGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0U2Vjb25kYXJ5VGFibGVEaWFsb2dPa2QoU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nLCBJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCk7Ci0JCVN0cmluZyBjYXRhbG9nID0gZGlhbG9nLmdldFNlbGVjdGVkQ2F0YWxvZygpOwotCQlTdHJpbmcgc2NoZW1hID0gZGlhbG9nLmdldFNlbGVjdGVkU2NoZW1hKCk7Ci0KLQkJaWYgKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsIHx8ICFzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKXsKLQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUobmFtZSk7Ci0JCX0KLQkJCi0JCWlmIChkaWFsb2cuaXNEZWZhdWx0Q2F0YWxvZ1NlbGVjdGVkKCkpIHsKLQkJCWlmIChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgIT0gbnVsbCkgewotCQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpID09IG51bGwgfHwgIXNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKS5lcXVhbHMoY2F0YWxvZykpewotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nKTsKLQkJfQotCQkKLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHRTY2hlbWFTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsIHx8ICFzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKS5lcXVhbHMoc2NoZW1hKSl7Ci0JCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoc2NoZW1hKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVNlY29uZGFyeVRhYmxlIGdldFNlbGVjdGVkU2Vjb25kYXJ5VGFibGUoKSB7Ci0JCXJldHVybiAoSVNlY29uZGFyeVRhYmxlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCi0JCi0Jdm9pZCByZW1vdmVTZWNvbmRhcnlUYWJsZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPElTZWNvbmRhcnlUYWJsZT4gaSA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkucmVtb3ZlKGkubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQl2b2lkIHVwZGF0ZUVuYWJsZW1lbnQoKSB7Ci0JCXRoaXMuZWRpdEJ1dHRvbi5zZXRFbmFibGVkKCEoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuaXNFbXB0eSgpKTsKLQkJdGhpcy5yZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmlzRW1wdHkoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuZW50aXR5ID0gKElFbnRpdHkpIG9iajsKLQkJaWYgKHRoaXMuZW50aXR5ID09IG51bGwpIHsKLQkJCXRoaXMuc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLnNldElucHV0KHRoaXMuZW50aXR5KTsKLQkJaWYgKCF0aGlzLmVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhpcy5lbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwkJCQotCQl9Ci0JCXVwZGF0ZUVuYWJsZW1lbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCXRoaXMuZW50aXR5LmVBZGFwdGVycygpLmFkZCh0aGlzLmVudGl0eUxpc3RlbmVyKTsKLQkJCWZvciAoSVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogdGhpcy5lbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5zZWNvbmRhcnlUYWJsZUxpc3RlbmVyKTsKLQkJCX0JCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbnRpdHkgIT0gbnVsbCkgewotCQkJZm9yIChJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgOiB0aGlzLmVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXMoKSkgewotCQkJCXNlY29uZGFyeVRhYmxlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnNlY29uZGFyeVRhYmxlTGlzdGVuZXIpOwotCQkJfQotCQkJdGhpcy5lbnRpdHkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuZW50aXR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVudGl0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX1NQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCQkoKElTZWNvbmRhcnlUYWJsZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLmVBZGFwdGVycygpLmFkZCh0aGlzLnNlY29uZGFyeVRhYmxlTGlzdGVuZXIpOwotCQkJfQotCQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUpIHsKLQkJCQkoKElTZWNvbmRhcnlUYWJsZSkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnNlY29uZGFyeVRhYmxlTGlzdGVuZXIpOwkJCQkKLQkJCX0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQl1cGRhdGVFbmFibGVtZW50KCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZW9uY2FyeVRhYmxlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9DQVRBTE9HCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9TQ0hFTUEKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fREVGQVVMVF9DQVRBTE9HCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX0RFRkFVTFRfU0NIRU1BKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlzZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlNTRjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotLyoqCi0gKiBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgZXh0ZW5kcyBHZW5lcmF0b3JDb21wb3NpdGU8SVNlcXVlbmNlR2VuZXJhdG9yPgotewotCXByaXZhdGUgQ0NvbWJvIHNlcXVlbmNlTmFtZUNvbWJvOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBzZXF1ZW5jZU5hbWVDb21ib0xpc3RlbmVyOwotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCXB1YmxpYyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVNlcXVlbmNlR2VuZXJhdG9yIGNyZWF0ZUdlbmVyYXRvcigpIHsKLQkJSVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gaWRNYXBwaW5nKCkuY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nKCkuc2V0U2VxdWVuY2VHZW5lcmF0b3Ioc2VxdWVuY2VHZW5lcmF0b3IpOwotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBJU2VxdWVuY2VHZW5lcmF0b3IgZ2VuZXJhdG9yKElJZCBpZE1hcHBpbmcpIHsKLQkJcmV0dXJuIGlkTWFwcGluZy5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSk7Ci0JCQotCQl0aGlzLm5hbWVUZXh0V2lkZ2V0ID0gYnVpbGROYW1lVGV4dChjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMubmFtZVRleHRXaWRnZXQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzLm5hbWVUZXh0V2lkZ2V0LCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSk7Ci0JCQotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2UpOwotCQkKLQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21ibyA9IGJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnNlcXVlbmNlTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoc2VxdWVuY2VOYW1lQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSk7Ci0JfQotCi0JcHJpdmF0ZSBDQ29tYm8gYnVpbGRTZXF1ZW5jZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY29tYm8uc2VsZWN0KDApOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihnZXRTZXF1ZW5jZU5hbWVMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgZ2V0U2VxdWVuY2VOYW1lTGlzdGVuZXIoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlTmFtZUNvbWJvTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21ib0xpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgdGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgc2VxdWVuY2VOYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIHRleHQuZXF1YWxzKHNlcXVlbmNlTmFtZUNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCQlJU2VxdWVuY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZ2V0R2VuZXJhdG9yKCk7Ci0JCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJCQkJZ2VuZXJhdG9yID0gY3JlYXRlR2VuZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJZ2VuZXJhdG9yLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSh0ZXh0KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZUNvbWJvTGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdG9yQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLmdlbmVyYXRvckNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVNlcXVlbmNlR2VuZXJhdG9yLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklTRVFVRU5DRV9HRU5FUkFUT1JfX1NQRUNJRklFRF9TRVFVRU5DRV9OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgc2VxdWVuY2VOYW1lID0gZ2V0R2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCk7Ci0JCQkJCWlmIChzZXF1ZW5jZU5hbWUgPT0gbnVsbCkgewotCQkJCQkJc2VxdWVuY2VOYW1lQ29tYm8uc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFzZXF1ZW5jZU5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHNlcXVlbmNlTmFtZSkpIHsKLQkJCQkJCXNlcXVlbmNlTmFtZUNvbWJvLnNldFRleHQoc2VxdWVuY2VOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQlzdXBlci5kb1BvcHVsYXRlKG9iaik7Ci0JCWlmIChvYmogPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXBvcHVsYXRlU2VxdWVuY2VOYW1lQ29tYm8oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZVNlcXVlbmNlTmFtZUNvbWJvKCk7Ci0JfQotCQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmKHRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJSUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldEdlbmVyYXRvcigpLmdldEpwYVByb2plY3QoKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBqcGFQcm9qZWN0LmNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU2VxdWVuY2VOYW1lQ29tYm8oKSB7Ci0JCWlmICh0aGlzLmdldEdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnNlcXVlbmNlTmFtZUNvbWJvLnNldEl0ZW0oMCwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQpOwotCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpIHsKLS8vCQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5yZW1vdmUoMSwgdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5nZXRJdGVtQ291bnQoKSAtIDEpOwotLy8JCQlTY2hlbWEgc2NoZW1hID0gZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVkKGdldEdlbmVyYXRvcigpLmdldEpwYVByb2plY3QoKS5nZXRTY2hlbWFOYW1lKCkpOwotLy8JCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLS8vCQkJCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoc2NoZW1hLnNlcXVlbmNlTmFtZXMoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5hZGQoKFN0cmluZykgc3RyZWFtLm5leHQoKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQlTdHJpbmcgc2VxdWVuY2VOYW1lID0gdGhpcy5nZXRHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKTsKLQkJaWYgKHNlcXVlbmNlTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMuc2VxdWVuY2VOYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhzZXF1ZW5jZU5hbWUpKSB7Ci0JCQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5zZXRUZXh0KHNlcXVlbmNlTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNlcXVlbmNlTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlzdXBlci5jbGVhcigpOwotCQl0aGlzLnNlcXVlbmNlTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TdHJpbmdXaXRoRGVmYXVsdENob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzc2MjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TdHJpbmdXaXRoRGVmYXVsdENob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgU3RyaW5nSG9sZGVyIHN0cmluZ0hvbGRlcjsKLQlwcml2YXRlIEFkYXB0ZXIgc3RyaW5nSG9sZGVyTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVCA9ICJkZWZhdWx0IjsKLQkKLQkKLQlwdWJsaWMgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZFN0cmluZ0hvbGRlckxpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFN0cmluZ0hvbGRlckxpc3RlbmVyKCkgewotCQl0aGlzLnN0cmluZ0hvbGRlckxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJc3RyaW5nSG9sZGVyQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIgPSBuZXcgQ0NvbWJvVmlld2VyKGNvbWJvKTsKLQkJdGhpcy5jb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYnVpbGRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCQotCQl0aGlzLmNvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyLnRoaXMuc2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoCi0JCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWNvbWJvTW9kaWZpZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpewotCQkKLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0JCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHtERUZBVUxUfTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50ID09IERFRkFVTFQgJiYgc3RyaW5nSG9sZGVyLndyYXBwZWRPYmplY3QoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBzdHJpbmdIb2xkZXIuZGVmYXVsdEl0ZW0oKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbCkgewotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gKFN0cmluZykgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmICh0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7Ci0JCQkJc2VsZWN0aW9uID0gbnVsbDsKLQkJCX0KLQkJCWlmICh0aGlzLnN0cmluZ0hvbGRlci5nZXRTdHJpbmcoKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuc3RyaW5nSG9sZGVyLnNldFN0cmluZyhzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCF0aGlzLnN0cmluZ0hvbGRlci5nZXRTdHJpbmcoKS5lcXVhbHMoc2VsZWN0aW9uKSkgewotCQkJCXRoaXMuc3RyaW5nSG9sZGVyLnNldFN0cmluZyhzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb21ib01vZGlmaWVkKE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZS5nZXRTb3VyY2UoKTsKLQkJY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIHRleHQgPSBjb21iby5nZXRUZXh0KCk7Ci0JCQotCQlpZiAodGV4dCAhPSBudWxsICYmIGNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0ZXh0LmVxdWFscyhjb21iby5nZXRJdGVtKDApKSkgewotCQkJdGV4dCA9IG51bGw7Ci0JCX0KLQkJaWYgKHRoaXMuc3RyaW5nSG9sZGVyLmdldFN0cmluZygpICE9IHRleHQpIHsKLQkJCXRoaXMuc3RyaW5nSG9sZGVyLnNldFN0cmluZyh0ZXh0KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3RyaW5nSG9sZGVyQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKHRoaXMuc3RyaW5nSG9sZGVyLmZlYXR1cmVDbGFzcygpKSA9PSAKLQkJCQl0aGlzLnN0cmluZ0hvbGRlci5mZWF0dXJlSWQoKSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuc3RyaW5nSG9sZGVyLnN1cHBvcnRzRGVmYXVsdCgpKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRCh0aGlzLnN0cmluZ0hvbGRlci5mZWF0dXJlQ2xhc3MoKSkgPT0gCi0JCQkJdGhpcy5zdHJpbmdIb2xkZXIuZGVmYXVsdEZlYXR1cmVJZCgpKSB7Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKGdldENvbWJvKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5zdHJpbmdIb2xkZXIgIT0gbnVsbCAmJiB0aGlzLnN0cmluZ0hvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJdGhpcy5zdHJpbmdIb2xkZXIud3JhcHBlZE9iamVjdCgpLmVBZGFwdGVycygpLmFkZCh0aGlzLnN0cmluZ0hvbGRlckxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnN0cmluZ0hvbGRlciAhPSBudWxsICYmIHRoaXMuc3RyaW5nSG9sZGVyLndyYXBwZWRPYmplY3QoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0cmluZ0hvbGRlci53cmFwcGVkT2JqZWN0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuc3RyaW5nSG9sZGVyTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5zdHJpbmdIb2xkZXIgPSAoU3RyaW5nSG9sZGVyKSBvYmo7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0SW5wdXQodGhpcy5zdHJpbmdIb2xkZXIpOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCWlmICh0aGlzLnN0cmluZ0hvbGRlci53cmFwcGVkT2JqZWN0KCkgPT0gbnVsbCkgewotCQkJdGhpcy5jb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb21ib1ZpZXdlci51cGRhdGUodGhpcy5jb21ib1ZpZXdlci5nZXRFbGVtZW50QXQoMCksIG51bGwpOwotCi0JCVN0cmluZyBzdHJpbmcgPSB0aGlzLnN0cmluZ0hvbGRlci5nZXRTdHJpbmcoKTsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSA9PSBERUZBVUxUKSB7Ci0JCQkJdGhpcy5jb21ib1ZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihERUZBVUxUKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIXRoaXMuY29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5nZXRUZXh0KCkuZXF1YWxzKHN0cmluZykpIHsKLQkJCQl0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0VGV4dChzdHJpbmcpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBDQ29tYm8gZ2V0Q29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBnZXRDb21ibygpOwotCX0KLQkvKioKLQkgKiBBbiBpbnRlcmZhY2UgdG8gd3JhcCBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyBhIHN0cmluZyB3aXRoIGEgZGVmYXVsdCBzZXR0aW5nCi0JICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBtdXN0IGJlIHBhc3NlZCBpbiB0byBwb3B1bGF0ZShFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFN0cmluZ0hvbGRlciBleHRlbmRzIEVPYmplY3QgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzdHJpbmcgc2V0dGluZyBmcm9tIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBzdHJpbmcgc2V0dGluZyBvbiB0aGUgd3JhcHBlZCBvYmplY3QKLQkJICogQHBhcmFtIHN0cmluZwotCQkgKi8KLQkJdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHN0cmluZyk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBDbGFzcyBvZiB0aGUgd3JhcHBlZCBvYmplY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJQ2xhc3MgZmVhdHVyZUNsYXNzKCk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBmZWF0dXJlIGlkIG9mIHN0cmluZyBzZXR0aW5nIG9uIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlpbnQgZmVhdHVyZUlkKCk7Ci0JCQotCQlib29sZWFuIHN1cHBvcnRzRGVmYXVsdCgpOwotCQkKLQkJaW50IGRlZmF1bHRGZWF0dXJlSWQoKTsKLQkJCi0JCS8qKgotCQkgKiBUaGUgd3JhcHBlZCBFT2JqZWN0IHRoYXQgdGhlIGVudW0gc2V0dGluZyBpcyBzdG9yZWQgb24KLQkJICogQHJldHVybgotCQkgKi8KLQkJRU9iamVjdCB3cmFwcGVkT2JqZWN0KCk7Ci0JCQotCQlTdHJpbmcgZGVmYXVsdEl0ZW0oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzA0NzQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVGFibGVDb21ibyBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBJVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDYWNoaW5nIHRoZSBjb25uZWN0aW9uUHJvZmlsZSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZSBsaXN0ZW5lci4gSWYgdGhlCi0JICogY2FjaGVkIHRhYmxlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsIHRoZW4gd2Ugbm8gbG9uZ2VyCi0JICogaGF2ZSBhY2Nlc3MgdG8gcGFyZW50IGFuZCBjYW5ub3QgZmluZCB0aGUgY29ubmVjdGlvblByb2ZpbGUKLQkgKi8KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBDQ29tYm8gY29tYm87Ci0KLQlwdWJsaWMgVGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5saXN0ZW5lciA9IGJ1aWxkVGFibGVMaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkVGFibGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXRhYmxlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb21ibygpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVRhYmxlQ29tYm8udGhpcy5wb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb21ibygpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVRhYmxlQ29tYm8udGhpcy5wb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbWJvKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJVGFibGVDb21iby50aGlzLnBvcHVsYXRlVGFibGVDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZGF0YWJhc2UgPT0gVGFibGVDb21iby50aGlzLmdldERhdGFiYXNlKCkpIHsKLQkJCQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJVGFibGVDb21iby50aGlzLnBvcHVsYXRlVGFibGVDb21ibygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHNjaGVtYSA9PSBUYWJsZUNvbWJvLnRoaXMuZ2V0VGFibGVTY2hlbWEoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlUYWJsZUNvbWJvLnRoaXMucG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0JCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5jb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCXRoaXMuY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0RW1wdHkpOwotCQl0aGlzLmNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB0YWJsZVRleHQgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCWlmICh0YWJsZVRleHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRhYmxlVGV4dCA9IG51bGw7Ci0JCQkJCWlmICh0YWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCB0YWJsZS5nZXRTcGVjaWZpZWROYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRhYmxlVGV4dCAhPSBudWxsICYmIGNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0YWJsZVRleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXRhYmxlVGV4dCA9IG51bGw7Ci0JCQkJfQotCQkJCWlmICh0YWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCAmJiB0YWJsZVRleHQgIT0gbnVsbCkgewotCQkJCQl0YWJsZS5zZXRTcGVjaWZpZWROYW1lKHRhYmxlVGV4dCk7Ci0JCQkJfQotCQkJCWlmICh0YWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCAmJiAhdGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscyh0YWJsZVRleHQpKSB7Ci0JCQkJCXRhYmxlLnNldFNwZWNpZmllZE5hbWUodGFibGVUZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZVRhYmxlTmFtZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fREVGQVVMVF9OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZURlZmF1bHRUYWJsZU5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX0RFRkFVTFRfU0NIRU1BKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9TQ0hFTUEpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlVGFibGVDb21ibygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLnRhYmxlID0gKElUYWJsZSkgb2JqOwotCQlpZiAodGhpcy50YWJsZSAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJaWYgKHRoaXMudGFibGUgIT0gbnVsbCkgewotCQkJcG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiBnZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRUYWJsZVNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMudGFibGUuZ2V0SnBhUHJvamVjdCgpLmNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGFibGVDb21ibygpIHsKLQkJaWYgKHRoaXMudGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIFRPRE8gZG9uJ3QgZG8gaW5zdGFuY2VvZiBjaGVjayBoZXJlIC0gY2hlY2sgb24gVGFibGUsIG9yIGlzUm9vdCBjaGVjawotCQkvLyBvbiBFbnRpdHkKLQkJLy8gdGhpcy50YWJsZUNvbWJvLnNldEVuYWJsZWQoISh0aGlzLnRhYmxlIGluc3RhbmNlb2YKLQkJLy8gU2luZ2xlVGFibGVJbmhlcml0YW5jZUNoaWxkVGFibGVJbXBsKSk7Ci0JCXBvcHVsYXRlRGVmYXVsdFRhYmxlTmFtZSgpOwotCQlpZiAoZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRUYWJsZVNjaGVtYSgpOwotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMgPSBzY2hlbWEudGFibGVOYW1lcygpOwotCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCh0YWJsZXMpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQl0aGlzLmNvbWJvLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCX0KLQkJcG9wdWxhdGVUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZGVmYXVsdFRhYmxlTmFtZSA9IHRhYmxlLmdldERlZmF1bHROYW1lKCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWNvbWJvLnNldEl0ZW0oMCwgTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRUYWJsZU5hbWUpKTsKLQkJaWYgKHNlbGVjdGlvbkluZGV4ID09IDApIHsKLQkJCS8vIGNvbWJvIHRleHQgZG9lcyBub3QgdXBkYXRlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gMiBtYXBwaW5ncyBvZgotCQkJLy8gdGhlIHNhbWUgdHlwZQotCQkJLy8gdGhhdCBib3RoIGhhdmUgYSBkZWZhdWx0IGNvbHVtbiBuYW1lLiBjbGVhciB0aGUgc2VsZWN0aW9uIGFuZAotCQkJLy8gdGhlbiBzZXQgaXQgYWdhaW4KLQkJCWNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQljb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVRhYmxlTmFtZSgpIHsKLQkJaWYgKHRoaXMudGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyB0YWJsZU5hbWUgPSB0aGlzLnRhYmxlLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUgPSB0aGlzLnRhYmxlLmdldERlZmF1bHROYW1lKCk7Ci0JCWlmICh0YWJsZU5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLmNvbWJvLmdldFRleHQoKS5lcXVhbHModGFibGVOYW1lKSkgewotCQkJCXRoaXMuY29tYm8uc2V0VGV4dCh0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLmNvbWJvLmdldFRleHQoKS5lcXVhbHMoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRUYWJsZU5hbWUpKSkgewotCQkJCXRoaXMuY29tYm8uc2VsZWN0KDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENDb21ibyBnZXRDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMuY29tYm87Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGdldENvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy50YWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJdGhpcy50YWJsZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5saXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMudGFibGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMubGlzdGVuZXIpOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2Zjk5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8vVE9ETyByZXBvcHVsYXRlIHRoaXMgcGFuZWwgYmFzZWQgb24gdGhlIEVudGl0eSB0YWJsZSBjaGFuZ2luZwotcHVibGljIGNsYXNzIFRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgSVRhYmxlIHRhYmxlOwotCQotCXByb3RlY3RlZCBUYWJsZUNvbWJvIHRhYmxlQ29tYm87Ci0JCi0JcHJvdGVjdGVkIENhdGFsb2dDb21ibyBjYXRhbG9nQ29tYm87Ci0JcHJvdGVjdGVkIFNjaGVtYUNvbWJvIHNjaGVtYUNvbWJvOwotCQotCXB1YmxpYyBUYWJsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwkJCi0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0JCQotCQlHcm91cCBjb2x1bW5Hcm91cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV90YWJsZVNlY3Rpb24pOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsJCQkJCi0JCWNvbHVtbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJY29sdW1uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy9jcmVhdGVkIHRoaXMgY29tcG9zaXRlIGJlY2F1c2UgY29tYm9zIGFzIGRpcmVjdCBjaGlsZHJlbiBvZiBhIEdyb3VwIGRvIG5vdCBoYXZlIGEgYm9yZGVyLCBubyBjbHVlIHdoeQotCQlDb21wb3NpdGUgaW50ZXJtZWRpYXJ5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb2x1bW5Hcm91cCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsJCQotCQlpbnRlcm1lZGlhcnlDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFRhYmxlTGFiZWwoaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJdGhpcy50YWJsZUNvbWJvID0gbmV3IFRhYmxlQ29tYm8oaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnRhYmxlQ29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRhYmxlQ29tYm8uZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9UQUJMRSk7Ci0KLQkJQ29tbW9uV2lkZ2V0cy5idWlsZENhdGFsb2dMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvID0gbmV3IENhdGFsb2dDb21ibyhpbnRlcm1lZGlhcnlDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChjYXRhbG9nQ29tYm8uZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9DQVRBTE9HKTsKLQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFNjaGVtYUxhYmVsKGludGVybWVkaWFyeUNvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5zY2hlbWFDb21ibyA9IG5ldyBTY2hlbWFDb21ibyhpbnRlcm1lZGlhcnlDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuc2NoZW1hQ29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHNjaGVtYUNvbWJvLmdldENvbWJvKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfU0NIRU1BKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLnRhYmxlID0gKElUYWJsZSkgb2JqOwotCQl0aGlzLnRhYmxlQ29tYm8ucG9wdWxhdGUodGhpcy50YWJsZSk7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvLnBvcHVsYXRlKHRoaXMudGFibGUpOwotCQl0aGlzLnNjaGVtYUNvbWJvLnBvcHVsYXRlKHRoaXMudGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLnRhYmxlQ29tYm8ucG9wdWxhdGUoKTsKLQkJdGhpcy5jYXRhbG9nQ29tYm8ucG9wdWxhdGUoKTsKLQkJdGhpcy5zY2hlbWFDb21iby5wb3B1bGF0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmNhdGFsb2dDb21iby5kaXNwb3NlKCk7Ci0JCXRoaXMuc2NoZW1hQ29tYm8uZGlzcG9zZSgpOwotCQl0aGlzLnRhYmxlQ29tYm8uZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMmY5MzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUlkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlIGV4dGVuZHMgR2VuZXJhdG9yQ29tcG9zaXRlPElUYWJsZUdlbmVyYXRvcj4KLXsKLQlwcml2YXRlIENDb21ibyB0YWJsZU5hbWVDb21ibzsKLQlwcml2YXRlIENDb21ibyBwa0NvbHVtbk5hbWVDb21ibzsKLQlwcml2YXRlIENDb21ibyB2YWx1ZUNvbHVtbk5hbWVDb21ibzsKLQlwcml2YXRlIENDb21ibyBwa0NvbHVtblZhbHVlQ29tYm87Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0JcHVibGljIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUYWJsZUdlbmVyYXRvciBjcmVhdGVHZW5lcmF0b3IoKSB7Ci0JCUlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGlkTWFwcGluZygpLmNyZWF0ZVRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZygpLnNldFRhYmxlR2VuZXJhdG9yKHRhYmxlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVRhYmxlR2VuZXJhdG9yIGdlbmVyYXRvcihJSWQgaWRNYXBwaW5nKSB7Ci0JCXJldHVybiBpZE1hcHBpbmcuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lKTsKLQkJCi0JCXRoaXMubmFtZVRleHRXaWRnZXQgPSBidWlsZE5hbWVUZXh0KGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5uYW1lVGV4dFdpZGdldC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMubmFtZVRleHRXaWRnZXQsIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9OQU1FKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZSk7Ci0JCQotCQl0aGlzLnRhYmxlTmFtZUNvbWJvID0gYnVpbGRUYWJsZU5hbWVDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGFibGVOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzLnRhYmxlTmFtZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVEFCTEUpOwotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uKTsKLQkJCi0JCXRoaXMucGtDb2x1bW5OYW1lQ29tYm8gPSBidWlsZFBrQ29sdW1uTmFtZUNvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5wa0NvbHVtbk5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMucGtDb2x1bW5OYW1lQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU4pOwotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uKTsKLQkJCi0JCXRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8gPSBidWlsZFZhbHVlQ29sdW1uTmFtZUNvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9WQUxVRV9DT0xVTU4pOwotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uVmFsdWUpOwotCQkKLQkJdGhpcy5wa0NvbHVtblZhbHVlQ29tYm8gPSBidWlsZFBrQ29sdW1uVmFsdWVDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMucGtDb2x1bW5WYWx1ZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy5wa0NvbHVtblZhbHVlQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9QUklNQVJZX0tFWV9DT0xVTU5fVkFMVUUpOwotCX0KLQotCXByaXZhdGUgQ0NvbWJvIGJ1aWxkVGFibGVOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQpOwotCQljb21iby5zZWxlY3QoMCk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGJ1aWxkVGFibGVOYW1lTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcml2YXRlIENDb21ibyBidWlsZFBrQ29sdW1uTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0KTsKLQkJY29tYm8uc2VsZWN0KDApOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZFBrQ29sdW1uTmFtZUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSBDQ29tYm8gYnVpbGRWYWx1ZUNvbHVtbk5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdCk7Ci0JCWNvbWJvLnNlbGVjdCgwKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoYnVpbGRWYWx1ZUNvbHVtbk5hbWVMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByaXZhdGUgQ0NvbWJvIGJ1aWxkUGtDb2x1bW5WYWx1ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0KTsKLQkJY29tYm8uc2VsZWN0KDApOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZFBrQ29sdW1uVmFsdWVMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRUYWJsZU5hbWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB0ZXh0ID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRhYmxlTmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0ZXh0LmVxdWFscyh0YWJsZU5hbWVDb21iby5nZXRJdGVtKDApKSkgewotCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQl9Ci0JCQkJSVRhYmxlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdldEdlbmVyYXRvcigpOwotCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJCQlnZW5lcmF0b3IgPSBjcmVhdGVHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZ2VuZXJhdG9yLnNldFNwZWNpZmllZFRhYmxlKHRleHQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRQa0NvbHVtbk5hbWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB0ZXh0ID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHBrQ29sdW1uTmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0ZXh0LmVxdWFscyhwa0NvbHVtbk5hbWVDb21iby5nZXRJdGVtKDApKSkgewotCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQl9Ci0JCQkJSVRhYmxlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdldEdlbmVyYXRvcigpOwotCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJCQlnZW5lcmF0b3IgPSBjcmVhdGVHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZ2VuZXJhdG9yLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSh0ZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkVmFsdWVDb2x1bW5OYW1lTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB2YWx1ZUNvbHVtbk5hbWVDb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdGV4dC5lcXVhbHModmFsdWVDb2x1bW5OYW1lQ29tYm8uZ2V0SXRlbSgwKSkpIHsKLQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJfQotCQkJCUlUYWJsZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZXRHZW5lcmF0b3IoKTsKLQkJCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCQkJZ2VuZXJhdG9yID0gY3JlYXRlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWdlbmVyYXRvci5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUodGV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBidWlsZFBrQ29sdW1uVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB0ZXh0ID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHBrQ29sdW1uVmFsdWVDb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdGV4dC5lcXVhbHMocGtDb2x1bW5WYWx1ZUNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXRleHQgPSBudWxsOwotCQkJCX0KLQkJCQlJVGFibGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZ2V0R2VuZXJhdG9yKCk7Ci0JCQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQkJCWdlbmVyYXRvciA9IGNyZWF0ZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCQlnZW5lcmF0b3Iuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSh0ZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0b3JDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuZ2VuZXJhdG9yQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGVHZW5lcmF0b3IuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX0dFTkVSQVRPUl9fU1BFQ0lGSUVEX1RBQkxFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgdGFibGVOYW1lID0gZ2V0R2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJCQkJaWYgKHRhYmxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJCQl0YWJsZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIXRhYmxlTmFtZUNvbWJvLmdldFRleHQoKS5lcXVhbHModGFibGVOYW1lKSkgewotCQkJCQkJdGFibGVOYW1lQ29tYm8uc2V0VGV4dCh0YWJsZU5hbWUpOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlUGtDb2x1bW5OYW1lQ29tYm8oKTsKLQkJCQkJcG9wdWxhdGVWYWx1ZUNvbHVtbk5hbWVDb21ibygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlR2VuZXJhdG9yLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9HRU5FUkFUT1JfX1NQRUNJRklFRF9QS19DT0xVTU5fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVQa0NvbHVtbk5hbWUoKTsKLQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlR2VuZXJhdG9yLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9HRU5FUkFUT1JfX1NQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBnZXRHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJCQkJaWYgKGNvbHVtbk5hbWUgPT0gbnVsbCkgewotCQkJCQkJdmFsdWVDb2x1bW5OYW1lQ29tYm8uc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCF2YWx1ZUNvbHVtbk5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKGNvbHVtbk5hbWUpKSB7Ci0JCQkJCQl2YWx1ZUNvbHVtbk5hbWVDb21iby5zZXRUZXh0KGNvbHVtbk5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGVHZW5lcmF0b3IuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX0dFTkVSQVRPUl9fU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGNvbHVtblZhbHVlID0gZ2V0R2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpOwotCQkJCQlpZiAoY29sdW1uVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJcGtDb2x1bW5WYWx1ZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghcGtDb2x1bW5WYWx1ZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoY29sdW1uVmFsdWUpKSB7Ci0JCQkJCQlwa0NvbHVtblZhbHVlQ29tYm8uc2V0VGV4dChjb2x1bW5WYWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZShvYmopOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBvcHVsYXRlVGFibGVOYW1lQ29tYm8oKTsKLQkJcG9wdWxhdGVQa0NvbHVtbk5hbWVDb21ibygpOwotCQlwb3B1bGF0ZVZhbHVlQ29sdW1uTmFtZUNvbWJvKCk7Ci0JCXBvcHVsYXRlUGtDb2x1bW5WYWx1ZUNvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQlwb3B1bGF0ZVRhYmxlTmFtZUNvbWJvKCk7Ci0JCXBvcHVsYXRlUGtDb2x1bW5OYW1lQ29tYm8oKTsKLQkJcG9wdWxhdGVWYWx1ZUNvbHVtbk5hbWVDb21ibygpOwotCQlwb3B1bGF0ZVBrQ29sdW1uVmFsdWVDb21ibygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmVuZ2FnZUxpc3RlbmVycygpOwotCQlpZiAoZ2V0R2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlyZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCQlzdXBlci5kaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJaWYodGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gaWRNYXBwaW5nKCkuZ2V0SnBhUHJvamVjdCgpOwotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IGpwYVByb2plY3QuY29ubmVjdGlvblByb2ZpbGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0JCWlmIChnZXRHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQoZ2V0R2VuZXJhdG9yKCkuZ2V0U2NoZW1hKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVUYWJsZU5hbWVDb21ibygpIHsKLQkJaWYgKHRoaXMuZ2V0R2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuaXNDb25uZWN0ZWQoKSkgewotCQkJdGhpcy50YWJsZU5hbWVDb21iby5yZW1vdmUoMSwgdGhpcy50YWJsZU5hbWVDb21iby5nZXRJdGVtQ291bnQoKS0xKTsKLQkJCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpOwotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMgPSBzY2hlbWEudGFibGVOYW1lcygpOwotCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCh0YWJsZXMpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQkJdGhpcy50YWJsZU5hbWVDb21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyB0YWJsZU5hbWUgPSB0aGlzLmdldEdlbmVyYXRvcigpLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCWlmICh0YWJsZU5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLnRhYmxlTmFtZUNvbWJvLmdldFRleHQoKS5lcXVhbHModGFibGVOYW1lKSkgewotCQkJCXRoaXMudGFibGVOYW1lQ29tYm8uc2V0VGV4dCh0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy50YWJsZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQa0NvbHVtbk5hbWVDb21ibygpIHsKLQkJaWYgKHRoaXMuZ2V0R2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXBvcHVsYXRlUGtDb2x1bW5DaG9pY2VzKCk7Ci0JCXBvcHVsYXRlUGtDb2x1bW5OYW1lKCk7Ci0JfQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVBrQ29sdW1uQ2hvaWNlcygpIHsKLQkJdGhpcy5wa0NvbHVtbk5hbWVDb21iby5yZW1vdmUoMSwgdGhpcy5wa0NvbHVtbk5hbWVDb21iby5nZXRJdGVtQ291bnQoKSAtIDEpOwotCQkKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQlpZiAoIXRoaXMudGFibGVOYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdCkpIHsgLy8gaG1tLAotCQkJCS8vIGlmCi0JCQkJLy8gdGhleQotCQkJCS8vIGFjdHVhbGx5Ci0JCQkJLy8gc2V0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gdGFibGUKLQkJCQkvLyB0bwotCQkJCS8vIERlZmF1bHQ/PwotCQkJCVN0cmluZyB0YWJsZU5hbWUgPSB0aGlzLnRhYmxlTmFtZUNvbWJvLmdldFRleHQoKTsKLQkJCQlTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0JCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJCVRhYmxlIHRhYmxlID0gc2NoZW1hLnRhYmxlTmFtZWQodGFibGVOYW1lKTsKLQkJCQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCh0YWJsZS5jb2x1bW5OYW1lcygpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJCQl0aGlzLnBrQ29sdW1uTmFtZUNvbWJvLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQa0NvbHVtbk5hbWUoKSB7Ci0JCVN0cmluZyBwa0NvbHVtbk5hbWUgPSB0aGlzLmdldEdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpOwotCQlpZiAocGtDb2x1bW5OYW1lICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy5wa0NvbHVtbk5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHBrQ29sdW1uTmFtZSkpIHsKLQkJCQl0aGlzLnBrQ29sdW1uTmFtZUNvbWJvLnNldFRleHQocGtDb2x1bW5OYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGtDb2x1bW5OYW1lQ29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmFsdWVDb2x1bW5OYW1lQ29tYm8oKSB7Ci0JCWlmICh0aGlzLmdldEdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpIHsKLQkJCXRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8ucmVtb3ZlKDEsIHRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxKTsKLQkJCWlmICghdGhpcy50YWJsZU5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0KSkgeyAvLyBobW0sCi0JCQkJLy8gaWYKLQkJCQkvLyB0aGV5Ci0JCQkJLy8gYWN0dWFsbHkKLQkJCQkvLyBzZXQKLQkJCQkvLyB0aGUKLQkJCQkvLyB0YWJsZQotCQkJCS8vIHRvCi0JCQkJLy8gRGVmYXVsdD8/Ci0JCQkJU3RyaW5nIHRhYmxlTmFtZSA9IHRoaXMudGFibGVOYW1lQ29tYm8uZ2V0VGV4dCgpOwotCQkJCVNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKLQkJCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCQkJVGFibGUgdGFibGUgPSBzY2hlbWEudGFibGVOYW1lZCh0YWJsZU5hbWUpOwotCQkJCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KHRhYmxlLmNvbHVtbk5hbWVzKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQkJCXRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyB2YWx1ZUNvbHVtbk5hbWUgPSB0aGlzLmdldEdlbmVyYXRvcigpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpOwotCQlpZiAodmFsdWVDb2x1bW5OYW1lICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy52YWx1ZUNvbHVtbk5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHZhbHVlQ29sdW1uTmFtZSkpIHsKLQkJCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUNvbWJvLnNldFRleHQodmFsdWVDb2x1bW5OYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUGtDb2x1bW5WYWx1ZUNvbWJvKCkgewotCQlpZiAodGhpcy5nZXRHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIHBrQ29sdW1uVmFsdWUgPSB0aGlzLmdldEdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKTsKLQkJaWYgKHBrQ29sdW1uVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLnBrQ29sdW1uVmFsdWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHBrQ29sdW1uVmFsdWUpKSB7Ci0JCQkJdGhpcy5wa0NvbHVtblZhbHVlQ29tYm8uc2V0VGV4dChwa0NvbHVtblZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGtDb2x1bW5WYWx1ZUNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlzdXBlci5jbGVhcigpOwotCQl0aGlzLnRhYmxlTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJdGhpcy5wa0NvbHVtbk5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCXRoaXMucGtDb2x1bW5WYWx1ZUNvbWJvLnNlbGVjdCgwKTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWVDb21iby5zZWxlY3QoMCk7Ci0JfQotCQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlwb3B1bGF0ZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlwb3B1bGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJcG9wdWxhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCQlwb3B1bGF0ZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJCXBvcHVsYXRlKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBwb3B1bGF0ZSgpIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCXBvcHVsYXRlVGFibGVOYW1lQ29tYm8oKTsKLQkJCQkJCXBvcHVsYXRlUGtDb2x1bW5DaG9pY2VzKCk7Ci0JCQkJCQlwb3B1bGF0ZVZhbHVlQ29sdW1uTmFtZUNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBUYWJsZSB0YWJsZSkgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYXJnZXRFbnRpdHlDaG9vc2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhcmdldEVudGl0eUNob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1ZTc2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhcmdldEVudGl0eUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRhcmdldEVudGl0eUNob29zZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgSVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZzsKLQlwcml2YXRlIEFkYXB0ZXIgcmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyOwotCQotCXByb3RlY3RlZCBDQ29tYm8gdGFyZ2V0RW50aXR5Q29tYm87Ci0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JCi0JcHVibGljIFRhcmdldEVudGl0eUNob29zZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkUmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcigpIHsKLQkJcmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcmVsYXRpb25zaGlwTWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQkgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkgICAgdGhpcy5jb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFRhcmdldEVudGl0eUxhYmVsKHRoaXMuY29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJdGhpcy50YXJnZXRFbnRpdHlDb21ibyA9IGJ1aWxkVGFyZ2V0RW50aXR5Q29tYm8odGhpcy5jb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJYnVpbGRUYXJnZXRFbnRpdHlTZWxlY3Rpb25CdXR0b24odGhpcy5jb21wb3NpdGUpOwotCi0JfQotCQotCXByb3RlY3RlZCBDQ29tYm8gYnVpbGRUYXJnZXRFbnRpdHlDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0RW1wdHkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQVJHRVRfRU5USVRZKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRhcmdldEVudGl0eU5hbWUgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCWlmICh0YXJnZXRFbnRpdHlOYW1lLmVxdWFscyhjb21iby5nZXRJdGVtKDApKSB8fCB0YXJnZXRFbnRpdHlOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl0YXJnZXRFbnRpdHlOYW1lID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXJlbGF0aW9uc2hpcE1hcHBpbmcudGFyZ2V0RW50aXR5SXNWYWxpZCh0YXJnZXRFbnRpdHlOYW1lKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXJlbGF0aW9uc2hpcE1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KHRhcmdldEVudGl0eU5hbWUpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHJlbGF0aW9uc2hpcE1hcHBpbmdDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpID09IAotCQkJCUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVJFTEFUSU9OU0hJUF9NQVBQSU5HX19TUEVDSUZJRURfVEFSR0VUX0VOVElUWSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MpID09IAotCQkJSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JUkVMQVRJT05TSElQX01BUFBJTkdfX0RFRkFVTFRfVEFSR0VUX0VOVElUWSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlwb3B1bGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAocmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZWxhdGlvbnNoaXBNYXBwaW5nLmVBZGFwdGVycygpLmFkZChyZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoSVJlbGF0aW9uc2hpcE1hcHBpbmcpIG9iajsKLQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvKCkgewotCQlpZiAocmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKSB7Ci0JCQl0YXJnZXRFbnRpdHlDb21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyB0YXJnZXRFbnRpdHkgPSB0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q29tYm8uc2V0SXRlbSgwLCBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0V2l0aE9uZVBhcmFtLCB0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKSk7Ci0JCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLnRhcmdldEVudGl0eUNvbWJvLmdldFRleHQoKS5lcXVhbHModGFyZ2V0RW50aXR5KSkgewotCQkJCXRoaXMudGFyZ2V0RW50aXR5Q29tYm8uc2V0VGV4dCh0YXJnZXRFbnRpdHkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRoaXMudGFyZ2V0RW50aXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAwKSB7Ci0JCQkJdGhpcy50YXJnZXRFbnRpdHlDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcG9zaXRlOwotCX0JCi0JCi0JLy9zZWUgIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS5lZGl0b3IucGx1Z2luLnJvd3MuQ2xhc3NBdHRyaWJ1dGVSb3cKLQkvL2ZvciBleGFtcGxlIG9mIHRoZSBoeXBlcmxpbmsgb3BlbmluZyBhIHJlc291cmNlCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZFRhcmdldEVudGl0eVNlbGVjdGlvbkJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2UpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYnJvd3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBicm93c2UoKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRoaXMudGFyZ2V0RW50aXR5Q29tYm8uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9PcGVuU2VsZWN0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb09wZW5TZWxlY3Rpb25EaWFsb2coKSB7Ci0JCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2c7Ci0JCXRyeSB7Ci0JCQlkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKSwKLQkJCQkJU2VhcmNoRW5naW5lLmNyZWF0ZVdvcmtzcGFjZVNjb3BlKCksCi0JCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9BTExfVFlQRVMsIAotCQkJICAgICAgICBmYWxzZSwKLQkJCQkJIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfSAKLQkJZGlhbG9nLnNldFRpdGxlKCJTZWxlY3QgVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQkJdGhpcy50YXJnZXRFbnRpdHlDb21iby5zZXRUZXh0KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJykpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UcmFuc2llbnRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVHJhbnNpZW50Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzFlOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UcmFuc2llbnRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXB1YmxpYyBUcmFuc2llbnRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9WZXJzaW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ZlcnNpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3ZmI2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ZlcnNpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnVtQ29tYm9WaWV3ZXIuRW51bUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbkNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJVmVyc2lvbiB2ZXJzaW9uOwotCQotCXByaXZhdGUgQ29sdW1uQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZTsKLQotCXByaXZhdGUgRW51bUNvbWJvVmlld2VyIHRlbXBvcmFsVHlwZVZpZXdlcjsKLQkKLQotCXB1YmxpYyBWZXJzaW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbnRyb2wgZ2VuZXJhbENvbnRyb2wgPSBidWlsZEdlbmVyYWxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLS8vCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCQotCQlDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCi0JCXRoaXMuY29sdW1uQ29tcG9zaXRlID0gbmV3IENvbHVtbkNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsJCQotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFRlbXBvcmFsTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRW51bUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlyZXR1cm4gZ2VuZXJhbENvbXBvc2l0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLnZlcnNpb24gPSAoSVZlcnNpb24pIG9iajsKLQkJaWYgKHRoaXMudmVyc2lvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLnZlcnNpb24uZ2V0Q29sdW1uKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCX0KLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIucG9wdWxhdGUobmV3IFRlbXBvcmFsVHlwZUhvbGRlcih0aGlzLnZlcnNpb24pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVmVyc2lvbiBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uOwotCX0KLQkKLQotCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZW1wb3JhbFR5cGVIb2xkZXIgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudW1Ib2xkZXIgewotCQkKLQkJcHJpdmF0ZSBJVmVyc2lvbiB2ZXJzaW9uOwotCQkKLQkJVGVtcG9yYWxUeXBlSG9sZGVyKElWZXJzaW9uIHZlcnNpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldCgpIHsKLQkJCXJldHVybiB0aGlzLnZlcnNpb24uZ2V0VGVtcG9yYWwoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0KE9iamVjdCBlbnVtU2V0dGluZykgewotCQkJdGhpcy52ZXJzaW9uLnNldFRlbXBvcmFsKChUZW1wb3JhbFR5cGUpIGVudW1TZXR0aW5nKTsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJQmFzaWMuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVZFUlNJT05fX1RFTVBPUkFMOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMudmVyc2lvbjsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGVudW1WYWx1ZXMoKSB7Ci0JCQlyZXR1cm4gVGVtcG9yYWxUeXBlLlZBTFVFUy50b0FycmF5KCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBUZW1wb3JhbFR5cGUgaGFzIG5vIERlZmF1bHQsIHJldHVybiBudWxsCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvKioKLQkJICogVGVtcG9yYWxUeXBlIGhhcyBubyBEZWZhdWx0LCByZXR1cm4gbnVsbAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBkZWZhdWx0U3RyaW5nKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL0pwYVBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSnBhUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNDFjY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSnBhUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc0NvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEpwYVBlcnNwZWN0aXZlRmFjdG9yeSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCi0JCS8vUGFja2FnZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkibGVmdCIsIElQYWdlTGF5b3V0LkxFRlQsIChmbG9hdCkgMC4yNSwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGVyLmFkZFZpZXcoSmF2YVVJLklEX1BBQ0tBR0VTKTsKLQkJZm9sZGVyLmFkZFBsYWNlaG9sZGVyKEphdmFVSS5JRF9UWVBFX0hJRVJBUkNIWSk7Ci0JCWZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQotCQkvL0RhdGFiYXNlIEV4cGxvcmVyIGFyZWEKLQkJbGF5b3V0LmFkZFZpZXcoIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuRGF0YVNvdXJjZUV4cGxvcmVyTmF2aWdhdG9yIiwgLy8kTk9OLU5MUy0xJAotCQkJSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNjAsIEphdmFVSS5JRF9QQUNLQUdFUyk7Ci0KLQkJLy9Qcm9ibGVtcy9Db25zb2xlIGFyZWEKLQkJSUZvbGRlckxheW91dCBvdXRwdXRGb2xkZXIgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKAotCQkJCSJib3R0b20iLCBJUGFnZUxheW91dC5CT1RUT00sIChmbG9hdCkgMC42MCwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0Rm9sZGVyLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX0JPT0tNQVJLUyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUHJvZ3Jlc3NDb25zdGFudHMuUFJPR1JFU1NfVklFV19JRCk7Ci0KLQkJLy9KUEEgRGV0YWlscyAoU3BsaXQgd2l0aCBQcm9ibGVtcy9Db25zb2xlIGFyZWEpCi0JCWxheW91dC5hZGRWaWV3KCJvcmcuZWNsaXBzZS5qcHQudWkuanBhRGV0YWlsc1ZpZXciLAotCQkJCUlQYWdlTGF5b3V0LlJJR0hULCAoZmxvYXQpIC42MCwgImJvdHRvbSIpOwotCQkKLQkJLy9KUEEgU3RydWN0dXJlIGFyZWEKLQkJSUZvbGRlckxheW91dCBvdXRsaW5lRm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkicmlnaHQiLCBJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KSAwLjc1LCBlZGl0b3JBcmVhKTsgLy8kTk9OLU5MUy0xJAotCQlvdXRsaW5lRm9sZGVyLmFkZFZpZXcoIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Iik7Ci0JCW91dGxpbmVGb2xkZXIuYWRkVmlldyhJUGFnZUxheW91dC5JRF9PVVRMSU5FKTsKLQotCQlsYXlvdXQuYWRkQWN0aW9uU2V0KEphdmFVSS5JRF9BQ1RJT05fU0VUKTsKLQkJbGF5b3V0LmFkZEFjdGlvblNldChKYXZhVUkuSURfRUxFTUVOVF9DUkVBVElPTl9BQ1RJT05fU0VUKTsKLQkJbGF5b3V0LmFkZEFjdGlvblNldChJUGFnZUxheW91dC5JRF9OQVZJR0FURV9BQ1RJT05fU0VUKTsKLQotCQkvLyB2aWV3cyAtIGphdmEKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX1BBQ0tBR0VTKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX1RZUEVfSElFUkFSQ0hZKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX1NPVVJDRV9WSUVXKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSmF2YVVJLklEX0pBVkFET0NfVklFVyk7Ci0KLQkJLy8gdmlld3MgLSBzdGFuZGFyZCB3b3JrYmVuY2gKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCi0JCS8vIG5ldyBhY3Rpb25zIC0gSmF2YSBwcm9qZWN0IGNyZWF0aW9uIHdpemFyZAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1BhY2thZ2VDcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3Q2xhc3NDcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3SW50ZXJmYWNlQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0VudW1DcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3QW5ub3RhdGlvbkNyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdTb3VyY2VGb2xkZXJDcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3U25pcHBldEZpbGVDcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcuZm9sZGVyIik7Ly8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZpbGUiKTsvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UudWkuZWRpdG9ycy53aXphcmRzLlVudGl0bGVkVGV4dEZpbGVXaXphcmQiKTsvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ByZWZzL0pwYVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZmExMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByZWZzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuVXNlckxpYnJhcnlQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQZXJzaXN0ZW50UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLlNjb3BlZFByZWZlcmVuY2VTdG9yZTsKLQotcHVibGljIGNsYXNzIEpwYVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qcHQudWkuanBhUHJlZmVyZW5jZVBhZ2UiOwotCQotCQotCXByaXZhdGUgSVBlcnNpc3RlbnRQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZXM7Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHVzZXJMaWJQcmVmZXJlbmNlczsKLQkKLQlwcml2YXRlIExhYmVsIGpwYUxpYkxhYmVsOwotCQkKLQlwcml2YXRlIENvbWJvIGpwYUxpYkNvbWJvOwotCQotCXByaXZhdGUgTGluayB1c2VyTGlic0xpbms7Ci0JCQotCQotCXB1YmxpYyBKcGFQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJcHJlZmVyZW5jZXMgPSAKLQkJCW5ldyBTY29wZWRQcmVmZXJlbmNlU3RvcmUoCi0JCQkJbmV3IEluc3RhbmNlU2NvcGUoKSwKLQkJCQlKcHRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJdXNlckxpYlByZWZlcmVuY2VzID0KLQkJCW5ldyBTY29wZWRQcmVmZXJlbmNlU3RvcmUoCi0JCQkJbmV3IEluc3RhbmNlU2NvcGUoKSwKLQkJCQlKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHt9Ci0JCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlqcGFMaWJMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgMSwgSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlUGFnZV9kZWZhdWx0SnBhTGliKTsKLQkJCQotCQlqcGFMaWJDb21ibyA9IGNyZWF0ZUNvbWJvKGNvbnRhaW5lciwgdHJ1ZSk7Ci0JCQotCQl1c2VyTGlic0xpbmsgPSAgbmV3IExpbmsoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl1c2VyTGlic0xpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdXNlckxpYnNMaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlUGFnZV91c2VyTGlic0xpbmspOwotCQl1c2VyTGlic0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCSgoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpKQotCQkJCQkJLm9wZW5QYWdlKFVzZXJMaWJyYXJ5UHJlZmVyZW5jZVBhZ2UuSUQsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCQotCQlwZXJmb3JtRGVmYXVsdHMoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBib29sZWFuIGZpbGxIb3Jpem9udGFsKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJaWYgKGZpbGxIb3Jpem9udGFsKSB7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl9Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxKcGFMaWJzKCkgewotCQlpbnQgaW5kZXggPSBqcGFMaWJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgc2VsZWN0ZWRKcGFMaWIgPSBudWxsOwotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJc2VsZWN0ZWRKcGFMaWIgPSBqcGFMaWJDb21iby5nZXRJdGVtKGpwYUxpYkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQl9Ci0JCQotCQlqcGFMaWJDb21iby5jbGVhclNlbGVjdGlvbigpOwotCQlqcGFMaWJDb21iby5zZXRJdGVtcyhKYXZhQ29yZS5nZXRVc2VyTGlicmFyeU5hbWVzKCkpOwotCQkKLQkJaWYgKHNlbGVjdGVkSnBhTGliICE9IG51bGwpIHsKLQkJCWludCBuZXdJbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGpwYUxpYkNvbWJvLmdldEl0ZW1zKCksIHNlbGVjdGVkSnBhTGliKTsKLQkJCWlmIChuZXdJbmRleCA+PSAwKSB7Ci0JCQkJanBhTGliQ29tYm8uc2VsZWN0KG5ld0luZGV4KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJZmlsbEpwYUxpYnMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZpbGxKcGFMaWJzKCk7Ci0JCVN0cmluZyBkZWZhdWx0TGliID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9MSUIpOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZWZhdWx0TGliKSkgewotCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihqcGFMaWJDb21iby5nZXRJdGVtcygpLCBkZWZhdWx0TGliKTsKLQkJfQotCQlpZiAoaW5kZXggPj0gMCkgewotCQkJanBhTGliQ29tYm8uc2VsZWN0KGluZGV4KTsKLQkJfQotCQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpbnQgaW5kZXggPSBqcGFMaWJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgZGVmYXVsdExpYiA9IChpbmRleCA+PSAwKSA/IGpwYUxpYkNvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZWZhdWx0TGliKSkgewotCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoSnBhUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfSlBBX0xJQiwgZGVmYXVsdExpYik7Ci0JCX0KLQkJdHJ5IHsKLQkJCXByZWZlcmVuY2VzLnNhdmUoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyhpb2UpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsIHBvaW50ZXIgY2hlY2sgLSBidWcgMTY4MzM3Ci0JCWlmIChqcGFMaWJMYWJlbCAhPSBudWxsKSBqcGFMaWJMYWJlbC5kaXNwb3NlKCk7Ci0JCWlmIChqcGFMaWJDb21ibyAhPSBudWxsKSBqcGFMaWJDb21iby5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCi0JCQotLy8JCXByaXZhdGUgYm9vbGVhbiBsaWJDb250YWluc0pwYUNsYXNzZXMoKSB7Ci0vLwkJCXJldHVybiB0cnVlOwotLy8JCQlTdHJpbmcgamFyTG9jYXRpb24gPSBnZXRTdHJpbmdWYWx1ZSgpOwotLy8JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlUGFnZV9pbnZhbGlkSnBhTGliOwotLy8JCQlib29sZWFuIGhhc0Vycm9yID0gZmFsc2U7Ci0vLwkJCQotLy8JCQl0cnkgewotLy8JCQkJSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoamFyTG9jYXRpb24pOwotLy8JCQkJaGFzRXJyb3IgPSBqYXJGaWxlLmdldEVudHJ5KCJqYXZheC9wZXJzaXN0ZW5jZS9FbnRpdHlNYW5hZ2VyLmNsYXNzIikgPT0gbnVsbDsKLS8vCQkJfQotLy8JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0vLwkJCQloYXNFcnJvciA9IHRydWU7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCWlmIChoYXNFcnJvcikgewotLy8JCQkJc2hvd0Vycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJcmV0dXJuICEgaGFzRXJyb3I7Ci0vLwkJfQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9EYXRhTW9kZWxQcm9wZXJ0eVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRGF0YU1vZGVsUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGI2NGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9EYXRhTW9kZWxQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuVmFsaWRhdGlvblN0YXR1czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFNb2RlbFByb3BlcnR5UGFnZSAKLQlleHRlbmRzIFByb3BlcnR5UGFnZQotCWltcGxlbWVudHMgTGlzdGVuZXIsIElEYXRhTW9kZWxMaXN0ZW5lcgotewotCXByb3RlY3RlZCBJRGF0YU1vZGVsIG1vZGVsOwotCQotCXByaXZhdGUgVmFsaWRhdGlvblN0YXR1cyBzdGF0dXMgPSBuZXcgVmFsaWRhdGlvblN0YXR1cygpOwotCXByaXZhdGUgTWFwIHZhbGlkYXRpb25NYXA7Ci0JcHJpdmF0ZSBTdHJpbmdbXSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lczsKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW5nID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCQotCXByaXZhdGUgU3RyaW5nIGluZm9wb3BJRDsKLQkKLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlQYWdlKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQltb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJc3luY2hIZWxwZXIgPSBpbml0aWFsaXplU3luY2hIZWxwZXIobW9kZWwpOwotCX0KLQkKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsU3luY2hIZWxwZXIgaW5pdGlhbGl6ZVN5bmNoSGVscGVyKElEYXRhTW9kZWwgZG0pIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxTeW5jaEhlbHBlcihkbSk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgdG9wID0gY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJc2V0dXBJbmZvcG9wKHRvcCk7Ci0JCXNldERlZmF1bHRzKCk7Ci0JCWFkZExpc3RlbmVycygpOwotCQlpbml0aWFsaXplVmFsaWRhdGlvblByb3BlcnRpZXMoKTsKLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpIHsKLQkJdmFsaWRhdGlvblByb3BlcnR5TmFtZXMgPSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgPT0gbnVsbCB8fCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGggPT0gMCkKLQkJCXZhbGlkYXRpb25NYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCWVsc2UgewotCQkJdmFsaWRhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKQotCQkJCXZhbGlkYXRpb25NYXAucHV0KHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzW2ldLCBuZXcgSW50ZWdlcihpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBzaG91bGQgcmV0dXJuIHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lcyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkIG9uIHRoaXMgcGFnZSBpbiB0aGUKLQkgKiBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIHByZXNlbnQgdGhlaXIgbWVzc2FnZXMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3AgbGV2ZWwgQ29tcG9zaXRlIGZvciB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIFNldCB1cCBpbmZvIHBvcCBob29rcyBpZiBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBJbmZvcG9wKENvbnRyb2wgcGFyZW50KSB7Ci0JCWlmIChnZXRJbmZvcG9wSUQoKSAhPSBudWxsKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIGdldEluZm9wb3BJRCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXR1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoaXMgcGFnZS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhcHByb3ByaWF0ZQotCSAqIGRlZmF1bHRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRzKCkgewotCQlyZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZXkgaGF2ZSBkZWZhdWx0IHNldHRpbmdzIHRoYXQgaGF2ZSBiZWVuIHN0b3JlZAotCSAqIGFuZCBuZWVkIHRvIGJlIHJlc3RvcmVkLgotCSAqIAotCSAqIEBzZWUgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIExpc3RlbmVycyB0byBjb250cm9scyBhdCB0aGlzIHBvaW50IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGV2ZW50cy4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0byBhZGQgbGlzdGVuZXJzIHRvIGl0cyBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JfQotCi0JLyoqCi0JICogRXhpdGluZyB0aGUgcGFnZS4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4aXQoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXJldHVybiBzdGF0dXMuaGFzRXJyb3Ioa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYW4gZXZlbnQgdGhhdCB0aGUgcmVjZWl2ZXIgaGFzIHJlZ2lzdGVyZWQgZm9yIG9jY3Vycy4gSWYgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhpcwotCSAqIG1ldGhvZCwgaXQgbXVzdCBjYWxsIHN1cGVyLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHdoaWNoIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZSBiYXNlZCBvbiB0aGUgbGFzdCBlcnJvciBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBlcnJvciA9IHN0YXR1cy5nZXRMYXN0RXJyTXNnKCk7Ci0JCWlmIChlcnJvciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCQlzZXRFcnJvck1lc3NhZ2UoKFN0cmluZykgbnVsbCk7Ci0JCQlTdHJpbmcgd2FybmluZyA9IHN0YXR1cy5nZXRMYXN0V2FybmluZ01zZygpOwotCQkJaWYgKHdhcm5pbmcgPT0gbnVsbCkgewotCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuV0FSTklORykKLQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgaW5mbyA9IHN0YXR1cy5nZXRMYXN0SW5mb01zZygpOwotCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKQotCQkJCQkJCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCX0gZWxzZSBpZiAoIWluZm8uZXF1YWxzKGdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJCXNldE1lc3NhZ2UoaW5mbywgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCF3YXJuaW5nLmVxdWFscyhnZXRNZXNzYWdlKCkpKQotCQkJCXNldE1lc3NhZ2Uod2FybmluZywgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfSBlbHNlIGlmICghZXJyb3IuZXF1YWxzKGdldEVycm9yTWVzc2FnZSgpKSkKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCQkJfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldEVycm9yU3RhdHVzKGtleSwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXYXJuaW5nU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgd2FybmluZ01lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldFdhcm5pbmdTdGF0dXMoa2V5LCB3YXJuaW5nTWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEluZm9TdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBpbmZvTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0SW5mb1N0YXR1cyhrZXksIGluZm9NZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPS1N0YXR1cyhJbnRlZ2VyIGtleSkgewotCQlzdGF0dXMuc2V0T0tTdGF0dXMoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIFdpemFyZCBqdXN0IHByaW9yIHRvIHJ1bm5pbmcgdGhlIHBlcmZvcm1GaW5pc2ggb3BlcmF0aW9uLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHN0b3JlIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhZ2UgaXMgbm93IGJlaW5nIHZhbGlkYXRlZC4gQXQgdGhpcyB0aW1lLCBlYWNoIGNvbnRyb2wgaXMgdmFsaWRhdGVkIGFuZCB0aGVuIHRoZQotCSAqIGNvbnRyb2xzIGFyZSB1cGRhdGVkIGJhc2VkIG9uIHRoZSByZXN1bHRzIGluIHRoZSBWYWxpZGF0aW9uU3RhdHVzIHdoaWNoIHdhcyB1cGRhdGVkIGR1cmluZwotCSAqIDxjb2RlPnZhbGlkYXRlQ29udHJvbHMoKTwvY29kZT4uIEZpbmFsbHksIGl0IHdpbGwgZGlzcGxheSB0aGUgbGFzdCBlcnJvciBtZXNzYWdlIGFuZCBpdAotCSAqIHdpbGwgc2V0IHRoZSBwYWdlIGNvbXBsZXRlLiBTdWJjbGFzc2VzIHdpbGwgbm90IHR5cGljYWxseSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghaXNWYWxpZGF0aW5nKSB7Ci0JCQlpc1ZhbGlkYXRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJc2V0VmFsaWQoc3RhdHVzLmdldExhc3RFcnJNc2coKSA9PSBudWxsKTsKLQkJCX0gCi0JCQlmaW5hbGx5IHsKLQkJCQlpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGluZGl2aWR1YWwgY29udHJvbHMuIFVzZSB2YWxpZGF0aW9uIGtleXMgdG8ga2VlcCB0cmFjayBvZiBlcnJvcnMuCi0JICogCi0JICogQHNlZSBzZXRPS1N0YXR1cyhJbnRlZ2VyKSBhbmQgc2V0RXJyb3JNZXNzYWdlKEludGVnZXIsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHZhbGlkYXRlQ29udHJvbHNCYXNlKCkgewotCQlpZiAoIXZhbGlkYXRpb25NYXAuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJvcE5hbWUgPSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXTsKLQkJCQlJbnRlZ2VyIHZhbEtleSA9IChJbnRlZ2VyKSB2YWxpZGF0aW9uTWFwLmdldChwcm9wTmFtZSk7Ci0JCQkJaWYgKHZhbEtleSAhPSBudWxsKQotCQkJCQl2YWxpZGF0ZVByb3BlcnR5KHByb3BOYW1lLCB2YWxLZXkpOwotCQkJCWlmICghZ2V0U3RhdHVzKHZhbEtleSkpCi0JCQkJCXJldHVybiBwcm9wTmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHZhbGlkYXRpb25rZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBJbnRlZ2VyIHZhbGlkYXRpb25LZXkpIHsKLQkJc2V0T0tTdGF0dXModmFsaWRhdGlvbktleSk7Ci0JCUlTdGF0dXMgc3RhdHVzMSA9IG1vZGVsLnZhbGlkYXRlUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKCFzdGF0dXMxLmlzT0soKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMxLmlzTXVsdGlTdGF0dXMoKSA/IHN0YXR1czEuZ2V0Q2hpbGRyZW4oKVswXS5nZXRNZXNzYWdlKCkgOiBzdGF0dXMxLmdldE1lc3NhZ2UoKTsKLQkJCXN3aXRjaCAoc3RhdHVzMS5nZXRTZXZlcml0eSgpKSB7Ci0JCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQkJc2V0RXJyb3JTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQkJc2V0V2FybmluZ1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLklORk8gOgotCQkJCQlzZXRJbmZvU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZiBjb250cm9scyBhZnRlciB2YWxpZGF0aW9uLiBTdWJsY2Fzc2VzIHNob3VsZCBjaGVjayB0aGUgc3RhdHVzIG9mCi0JICogdmFsaWRhdGlvbiBrZXlzIHRvIGRldGVybWluZSBlbmFibGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCX0KLQkKLQkKLQkvKgotCSAqIElmIGEgcHJvcGVydHkgY2hhbmdlcyB0aGF0IHdlIHdhbnQgdG8gdmFsaWRhdGUsIGZvcmNlIHZhbGlkYXRpb24gb24gdGhpcyBwYWdlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWxMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaWYgKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzICE9IG51bGwgJiYgKGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcgfHwgKCFpc1ZhbGlkKCkgJiYgZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcpKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChzeW5jaEhlbHBlciAhPSBudWxsKSB7Ci0JCQlzeW5jaEhlbHBlci5kaXNwb3NlKCk7Ci0JCQlzeW5jaEhlbHBlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIGluZm9wb3BJRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmZvcG9wSUQoU3RyaW5nIGluZm9wb3BJRCkgewotCQl0aGlzLmluZm9wb3BJRCA9IGluZm9wb3BJRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4OWFkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhUGxhdGZvcm1SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LklKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UgCi0JZXh0ZW5kcyBEYXRhTW9kZWxQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIElKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlwcml2YXRlIFBsYXRmb3JtR3JvdXAgcGxhdGZvcm1Hcm91cDsKLQkKLQlwcml2YXRlIENvbm5lY3Rpb25Hcm91cCBjb25uZWN0aW9uR3JvdXA7Ci0JCi0JcHJpdmF0ZSBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAgcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwOwotCQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBTYW1wbGVQcm9wZXJ0eVBhZ2UuCi0JICovCi0JcHVibGljIEpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJc3VwZXIoRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIoKSkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJcGxhdGZvcm1Hcm91cCA9IG5ldyBQbGF0Zm9ybUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNvbm5lY3Rpb25Hcm91cCA9IG5ldyBDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwID0gbmV3IFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChjb21wb3NpdGUpOwotCQkKLQkJc2V0UnVudGltZSgpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UnVudGltZSgpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSBmYWNldGVkUHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUUsIHJ1bnRpbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJSUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCwKLQkJCUlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuQ09OTkVDVElPTiwKLQkJCUlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIChKcGFQcm9qZWN0KSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJSnBhUHJvamVjdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCWlmIChmaWxsSG9yaXpvbnRhbCkgewotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGxhdGZvcm1Hcm91cC5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJY29ubmVjdGlvbkdyb3VwLnBlcmZvcm1EZWZhdWx0cygpOwotCQlwZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpOwotCQkKLQkJLy8gdGhlIGZhY2V0IGhhcyBiZWVuIHVuaW5zdGFsbGVkIGR1cmluZyBvdXIgdHJpcCB0byB0aGUgcHJvcGVydGllcyAuLi4KLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlKcGFGYWNldFV0aWxzLnNldFBsYXRmb3JtKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNX0lEKSk7Ci0JCQlKcGFGYWNldFV0aWxzLnNldENvbm5lY3Rpb25OYW1lKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTk5FQ1RJT04pKTsKLQkJCUpwYUZhY2V0VXRpbHMuc2V0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5ESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJ1aWxkUHJvamVjdCgpOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFByb2plY3QoKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyByPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgcG0pOwotCQkJCX0gCi0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJSnB0VWlQbHVnaW4ubG9nKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bih0cnVlLCBmYWxzZSwgcik7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7IC8qIG5vdGhpbmcgdG8gZG8gKi8gfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZSkgeyAvKiBub3RoaW5nIHRvIGRvICovIH0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQbGF0Zm9ybUdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIENvbWJvVmlld2VyIHBsYXRmb3JtQ29tYm87Ci0JCQotCQkKLQkJcHVibGljIFBsYXRmb3JtR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BsYXRmb3JtTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyBUT0RPCi0JCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJRGFsaUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCQkJCi0JCQlwbGF0Zm9ybUNvbWJvID0gbmV3IENvbWJvVmlld2VyKGNyZWF0ZUNvbWJvKGdyb3VwLCB0cnVlKSk7Ci0JCQlwbGF0Zm9ybUNvbWJvLnNldENvbnRlbnRQcm92aWRlcigKLQkJCQkJbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KEpwYVBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuYWxsSnBhUGxhdGZvcm1JZHMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0JCQkJCX0KLQkJCQkpOwotCQkJcGxhdGZvcm1Db21iby5zZXRMYWJlbFByb3ZpZGVyKAotCQkJCQluZXcgSUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SnBhUGxhdGZvcm1MYWJlbCgoU3RyaW5nKSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJcGxhdGZvcm1Db21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShQTEFURk9STV9JRCwgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwbGF0Zm9ybUNvbWJvLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJLy8gd2UgbmVlZCBzb21lIGlucHV0IGhlcmUsIGV2ZW4gaWYgaXQgbWVhbnMgYWJzb2x1dGVseSBub3RoaW5nCi0JCQlwbGF0Zm9ybUNvbWJvLnNldElucHV0KCJudWxsIGlucHV0Iik7Ci0JCQlwZXJmb3JtRGVmYXVsdHMoKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJCVN0cmluZyBwbGF0Zm9ybUlkID0gZ2V0SnBhUHJvamVjdCgpLmdldFBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KFBMQVRGT1JNX0lELCBwbGF0Zm9ybUlkKTsKLQkJCXBsYXRmb3JtQ29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHBsYXRmb3JtSWQpKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGZpbmFsIGNsYXNzIENvbm5lY3Rpb25Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb25uZWN0aW9uQ29tYm87Ci0JCQotCQlwcml2YXRlIExpbmsgY29ubmVjdGlvbkxpbms7Ci0JCQotCQkKLQkJcHVibGljIENvbm5lY3Rpb25Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCi0JCQljb25uZWN0aW9uQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgdHJ1ZSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJSnBhSGVscENvbnRleHRJZHMuUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX0NPTk5FQ1RJT04pOwotCQkJY29ubmVjdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCQluZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbkNvbWJvLmdldEl0ZW0oY29ubmVjdGlvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQlmaWxsQ29ubmVjdGlvbnMoKTsKLQkJCQotCQkJY29ubmVjdGlvbkxpbmsgPSBuZXcgTGluayhncm91cCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29ubmVjdGlvbkxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbmspOwotCQkJY29ubmVjdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCW9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCk7CQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJCXBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGZpbGxDb25uZWN0aW9ucygpIHsKLQkJCS8vY2xlYXIgb3V0IGNvbm5lY3Rpb24gZW50cmllcyBmcm9tIHByZXZpb3VzIGxvZ2luLgotCQkJY29ubmVjdGlvbkNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCkucHJvZmlsZU5hbWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCWNvbm5lY3Rpb25Db21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbk5hbWUpOwotCQkJaWYgKGNvbm5lY3Rpb25OYW1lID09IG51bGwpIHsKLQkJCQljb25uZWN0aW9uQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbm5lY3Rpb25Db21iby5zZXRUZXh0KGNvbm5lY3Rpb25OYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCkgewotCQkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdQcm9maWxlKCk7Ci0JCQlpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJCWZpbGxDb25uZWN0aW9ucygpOwotCQkJCW1vZGVsLnNldFByb3BlcnR5KENPTk5FQ1RJT04sIGNvbm5lY3Rpb25OYW1lKTsKLQkJCQljb25uZWN0aW9uQ29tYm8uc2VsZWN0KGNvbm5lY3Rpb25Db21iby5pbmRleE9mKGNvbm5lY3Rpb25OYW1lKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGRpc2NvdmVyQ2xhc3Nlc0J1dHRvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGxpc3RDbGFzc2VzQnV0dG9uOwotCQkKLQkJCi0JCXB1YmxpYyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIElKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0NMQVNTUEFUSCk7Ci0JCQkKLQkJCWRpc2NvdmVyQ2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGlzY292ZXJDbGFzc2VzQnV0dG9uLCBTV1QuUkFESU8pOwotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQotCQkJbGlzdENsYXNzZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uLCBTV1QuUkFESU8pOwotCQkJbGlzdENsYXNzZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQotCQkJbW9kZWwuYWRkTGlzdGVuZXIoCi0JCQkJCW5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlpZiAoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQkJCQlib29sZWFuIGRpc2NvdmVyQ2xhc3NlcyA9IChCb29sZWFuKSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJCQkJCQlkaXNjb3ZlckNsYXNzZXNCdXR0b24uc2V0U2VsZWN0aW9uKGRpc2NvdmVyQ2xhc3Nlcyk7Ci0JCQkJCQkJCWxpc3RDbGFzc2VzQnV0dG9uLnNldFNlbGVjdGlvbighIGRpc2NvdmVyQ2xhc3Nlcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQotCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlib29sZWFuIGRpc2NvdmVyQ2xhc3NlcyA9IGdldEpwYVByb2plY3QoKS5pc0Rpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGRpc2NvdmVyQ2xhc3Nlcyk7Ci0JCQlkaXNjb3ZlckNsYXNzZXNCdXR0b24uc2V0U2VsZWN0aW9uKGRpc2NvdmVyQ2xhc3Nlcyk7Ci0JCQlsaXN0Q2xhc3Nlc0J1dHRvbi5zZXRTZWxlY3Rpb24oISBkaXNjb3ZlckNsYXNzZXMpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9BYnN0cmFjdFNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vQWJzdHJhY3RTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQwOGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9BYnN0cmFjdFNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VsZWN0aW9uUGFydGljaXBhbnQgCi0JaW1wbGVtZW50cyBJU2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0U2VsZWN0aW9uUGFydGljaXBhbnQoSVNlbGVjdGlvbk1hbmFnZXIgdGhlU2VsZWN0aW9uTWFuYWdlcikgewotCQlzZWxlY3Rpb25NYW5hZ2VyID0gdGhlU2VsZWN0aW9uTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSVNlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9JU2VsZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdmZDYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9JU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGludGVyZmFjZSBJU2VsZWN0aW9uTWFuYWdlciAKLXsJCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gIAotCSAqIFRoaXMgd2lsbCBuZXZlciBiZSBudWxsLCBidXQgaXQgbWF5IGJlIDxjb2RlPlNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjwvY29kZT4uCi0JICovCi0JcHVibGljIFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCk7Ci0JCi0JLyoqCi0JICogTm90IHRvIGJlIGNhbGxlZCBsaWdodGx5LCB0aGlzIHdpbGwgYWZmZWN0IHRoZSBzZWxlY3Rpb24gZm9yIGFsbCBpbnRlcmVzdGVkCi0JICogb2JqZWN0cyBpbiBhIHdpbmRvdy4KLQkgKiBUaGUgbmV3U2VsZWN0aW9uIHdpbGwgYmUgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pOwotCQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgbGlnaHRseSwgdGhpcyB3aWxsIGFmZmVjdCB0aGUgc2VsZWN0aW9uIGZvciBhbGwgaW50ZXJlc3RlZAotCSAqIG9iamVjdHMgaW4gYSB3aW5kb3cuCi0JICogVGhlIG9sZFNlbGVjdGlvbiB3aWxsIGJlIGRlc2VsZWN0ZWQsIGlmZiBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlbGVjdChTZWxlY3Rpb24gb2xkU2VsZWN0aW9uKTsKLQkKLQkvKioKLQkgKiBUaGlzIG1heSBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgcGFydCB3aXRoIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBpZiB0aGUgcGFydAotCSAqIGlzIGtub3duIHRvIG5lZWQgYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBiZWZvcmUgaXQgaXMgZXZlciBhY3RpdmF0ZWQKLQkgKiBvciBpbiB0aGUgY2FzZSBpdCBtYXkgYmUgYWN0aXZhdGVkIHByaW9yIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBiZWluZyAKLQkgKiBjcmVhdGVkLgotCSAqIAotCSAqIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRlcmVnaXN0ZXIgYSBwYXJ0LCBhcyB0aGF0IGhhcHBlbnMgd2hlbiB0aGUgCi0JICogcGFydCBpcyBjbG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoSVdvcmtiZW5jaFBhcnQgcGFydCk7CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0lTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0lTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjU3ZDAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9JU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSBwYXJ0aWNpcGFudAotCSAqLwotCVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKTsKLQkKLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSBjZW50cmFsIHNlbGVjdGlvbiBtYW5hZ2VyLgotCSAqIFVwZGF0ZSB0aGlzIHBhcnRpY2lwYW50IGFjY29yZGluZ2x5LgotCSAqLwotCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldnQpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgc2VsZWN0aW9uIHBhcnRpY2lwYW50IHNob3VsZCBkaXNjb25uZWN0IGl0c2VsZiBmcm9tCi0JICogaXRzIHBhcnQgd2hlbiBpdHMgcGFydCBpcyBoaWRkZW4gZnJvbSB2aWV3LgotCSAqIDxiPlR5cGljYWxseTwvYj4gZWRpdG9yIHBhcnRpY2lwYW50cyB3aWxsIHJldHVybiB0cnVlIGFuZCB2aWV3IHBhcnRpY2lwYW50cyB3aWxsCi0JICogcmV0dXJuIGZhbHNlLgotCSAqLwotCWJvb2xlYW4gZGlzcG9zZU9uSGlkZSgpOwotCQotCS8qKgotCSAqIFRoaXMgcGFydGljaXBhbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZCAobW9zdCBsaWtlbHkgYmVjYXVzZSBpdHMgcGFydCBoYXMgCi0JICogY2xvc2VkKS4gIERpc3Bvc2Ugb2YgaXQuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODRhYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuSnBhRGV0YWlsc1ZpZXc7Ci0KLQotcHVibGljIGNsYXNzIEpwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudCBleHRlbmRzIEFic3RyYWN0U2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JcHJpdmF0ZSBKcGFEZXRhaWxzVmlldyBkZXRhaWxzVmlldzsKLQkKLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50KAotCQkJCUlTZWxlY3Rpb25NYW5hZ2VyIHRoZVNlbGVjdGlvbk1hbmFnZXIsIEpwYURldGFpbHNWaWV3IHZpZXcpIHsKLQkJc3VwZXIodGhlU2VsZWN0aW9uTWFuYWdlcik7Ci0JCWRldGFpbHNWaWV3ID0gdmlldzsKLQl9Ci0JCi0JCi0JcHVibGljIFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBkZXRhaWxzVmlldy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQlkZXRhaWxzVmlldy5zZWxlY3QoZXZ0LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGlzcG9zZU9uSGlkZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBubyBvcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYTk0OTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuSnBhU3RydWN0dXJlVmlldzsKLQotcHVibGljIGNsYXNzIEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50IAotCWV4dGVuZHMgQWJzdHJhY3RTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLXsKLQlwcml2YXRlIEpwYVN0cnVjdHVyZVZpZXcgc3RydWN0dXJlVmlldzsKLQkKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc3RydWN0dXJlVmlld0xpc3RlbmVyOwotCQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudCgKLQkJCQlJU2VsZWN0aW9uTWFuYWdlciB0aGVTZWxlY3Rpb25NYW5hZ2VyLCBKcGFTdHJ1Y3R1cmVWaWV3IHRoZU91dGxpbmVWaWV3KSB7Ci0JCXN1cGVyKHRoZVNlbGVjdGlvbk1hbmFnZXIpOwotCQlzdHJ1Y3R1cmVWaWV3ID0gdGhlT3V0bGluZVZpZXc7Ci0JCXN0cnVjdHVyZVZpZXdMaXN0ZW5lciA9IG5ldyBTdHJ1Y3R1cmVWaWV3U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJc3RydWN0dXJlVmlldy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc3RydWN0dXJlVmlld0xpc3RlbmVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzdHJ1Y3R1cmVWaWV3LmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQlzdHJ1Y3R1cmVWaWV3LnNlbGVjdChldnQuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNwb3NlT25IaWRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgU3RydWN0dXJlVmlld1NlbGVjdGlvbkxpc3RlbmVyIAotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdChzdHJ1Y3R1cmVWaWV3LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyZDY4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uIAotewotCXB1YmxpYyBzdGF0aWMgU2VsZWN0aW9uIE5VTExfU0VMRUNUSU9OID0gbmV3IFNlbGVjdGlvbigpOwotCQotCXByaXZhdGUgSUpwYUNvbnRlbnROb2RlIHNlbGVjdGVkTm9kZTsKLQkKLQkKLQkvKiBVc2VkIGludGVybmFsbHkgLSBvbmx5IGZvciBOVUxMX1NFTEVDVElPTiAqLwotCXByaXZhdGUgU2VsZWN0aW9uKCkge30KLQkKLQlwdWJsaWMgU2VsZWN0aW9uKElKcGFDb250ZW50Tm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3QgaGF2ZSBub24tbnVsbCBub2RlLiAgVXNlIE5VTExfU0VMRUNUSU9OIG90aGVyd2lzZS4iKTsKLQkJfQotCQkKLQkJc2VsZWN0ZWROb2RlID0gbm9kZTsKLQl9Ci0JCi0JcHVibGljIElKcGFDb250ZW50Tm9kZSBnZXRTZWxlY3RlZE5vZGUoKSB7Ci0JCXJldHVybiBzZWxlY3RlZE5vZGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghIChvYmogaW5zdGFuY2VvZiBTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICh0aGlzID09IE5VTExfU0VMRUNUSU9OICYmIG9iaiA9PSBOVUxMX1NFTEVDVElPTikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICh0aGlzID09IE5VTExfU0VMRUNUSU9OIHx8IG9iaiA9PSBOVUxMX1NFTEVDVElPTikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGUuZXF1YWxzKCgoU2VsZWN0aW9uKSBvYmopLnNlbGVjdGVkTm9kZSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWlmICh0aGlzID09IE5VTExfU0VMRUNUSU9OKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGVkTm9kZS5oYXNoQ29kZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh0aGlzID09IE5VTExfU0VMRUNUSU9OKSB7Ci0JCQlyZXR1cm4gIk5VTExfU0VMRUNUSU9OIjsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBzZWxlY3RlZE5vZGUudG9TdHJpbmcoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25FdmVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjBlZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvbkV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgCi17Ci0JLyoqCi0JICogU2VyaWFsaXphYmxlIHVpZAotCSAqIEBzaW5jZSAwLjUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VsZWN0aW9uIG9iamVjdCBpcyBub3cgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBTRUxFQ1RJT04gPSAxOwotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBzZWxlY3Rpb24gb2JqZWN0IGhhcyBub3cgYmVlbiBkZXNlbGVjdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgREVTRUxFQ1RJT04gPSAyOwotCQotCQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gb2JqZWN0IHdob3NlIHNlbGVjdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQKLQkgKi8KLQlwcml2YXRlIFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHNlbGVjdGlvbiBldmVudCwgZWl0aGVyIGEgU0VMRUNUSU9OIG9yIGEgREVTRUxFQ1RJT04KLQkgKi8KLQlwcml2YXRlIGludCB0eXBlOwotCQotCQotCXB1YmxpYyBTZWxlY3Rpb25FdmVudChTZWxlY3Rpb24gdGhlU2VsZWN0aW9uLCBpbnQgdGhlVHlwZSwgT2JqZWN0IHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlzZWxlY3Rpb24gPSB0aGVTZWxlY3Rpb247Ci0JCXR5cGUgPSB0aGVUeXBlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlbGVjdGlvbiBvYmplY3Qgd2hvc2Ugc2VsZWN0aW9uIHN0YXR1cyBoYXMgY2hhbmdlZAotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgb2Ygc2VsZWN0aW9uIGV2ZW50LCBlaXRoZXIgYSBTRUxFQ1RJT04gb3IgYSBERVNFTEVDVElPTgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YWYwOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotLyoqCi0gKiBBIDxjb2RlPlNlbGVjdGlvbk1hbmFnZXI8L2NvZGU+IHN0b3JlcyB0aGUgY3VycmVudCA8Y29kZT5TZWxlY3Rpb248L2NvZGU+IGFuZCAKLSAqIG5vdGlmaWVzIDxjb2RlPklTZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT5zIHdoZW4gdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uTWFuYWdlcgotCWltcGxlbWVudHMgSVNlbGVjdGlvbk1hbmFnZXIKLXsKLQkvKiBUaGUgc2V0IG9mIHBhZ2VzIGZvciB3aGljaCB0aGlzIG9iamVjdCBpcyBtYW5hZ2luZyBzZWxlY3Rpb25zICovCi0JcHJpdmF0ZSBTZXQgcGFnZXM7Ci0JCi0JLyogVGhlIG1hcCBvZiA8Y29kZT5JU2VsZWN0aW9uUGFydGljaXBhbnQ8L2NvZGU+cyAoa2V5ZWQgYnkgcGFydCkgdGhpcyBvYmplY3QKLQkgICBpcyB1c2luZyB0byBtYW5hZ2Ugc2VsZWN0aW9ucyAqLwotCXByaXZhdGUgTWFwIHNlbGVjdGlvblBhcnRpY2lwYW50czsKLQkKLQlwcml2YXRlIElQYWdlTGlzdGVuZXIgcGFnZUxpc3RlbmVyOwotCQotCXByaXZhdGUgSVBhcnRMaXN0ZW5lcjIgcGFydExpc3RlbmVyOwotCQotCS8qIFRoZSB3aW5kb3cgZm9yIHdoaWNoIHRoaXMgb2JqZWN0IG1hbmFnZXMgc2VsZWN0aW9ucyAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQkKLQkKLQlwdWJsaWMgU2VsZWN0aW9uTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJcGFnZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQoKSk7Ci0JCXNlbGVjdGlvblBhcnRpY2lwYW50cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCgpKTsKLQkJcGFnZUxpc3RlbmVyID0gbmV3IFBhZ2VMaXN0ZW5lcigpOwotCQlwYXJ0TGlzdGVuZXIgPSBuZXcgUGFydExpc3RlbmVyKCk7Ci0JCWN1cnJlbnRTZWxlY3Rpb24gPSBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7Ci0JCXdpbmRvdyA9IGFXaW5kb3c7Ci0JCWFXaW5kb3cuYWRkUGFnZUxpc3RlbmVyKHBhZ2VMaXN0ZW5lcik7Ci0JCWluaXRQYWdlKGFXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRQYWdlKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJaWYgKChwYWdlICE9IG51bGwpICYmICghIHBhZ2VzLmNvbnRhaW5zKHBhZ2UpKSkgewotCQkJcGFnZS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCXBhZ2VzLmFkZChwYWdlKTsKLQkJCUlFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlpbml0UGFydChhY3RpdmVFZGl0b3IpOwotCQkJc2VsZWN0UGFydChhY3RpdmVFZGl0b3IpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlUGFnZShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCWlmICgocGFnZSAhPSBudWxsKSAmJiAocGFnZXMuY29udGFpbnMocGFnZSkpKSB7Ci0JCQlwYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCQkJcGFnZXMucmVtb3ZlKHBhZ2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25QYXJ0aWNpcGFudHMuZ2V0KHBhcnQpID09IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uUGFydGljaXBhbnQgc2VsZWN0aW9uUGFydGljaXBhbnQgPSAKLQkJCQkJKElTZWxlY3Rpb25QYXJ0aWNpcGFudCkgcGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25QYXJ0aWNpcGFudC5jbGFzcyk7Ci0JCQkJaWYgKHNlbGVjdGlvblBhcnRpY2lwYW50ICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uUGFydGljaXBhbnRzLnB1dChwYXJ0LCBzZWxlY3Rpb25QYXJ0aWNpcGFudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3RQYXJ0KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJSVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gZ2V0U2VsZWN0aW9uUGFydGljaXBhbnQocGFydCk7Ci0JCWlmIChzZWxlY3Rpb25QYXJ0aWNpcGFudCAhPSBudWxsKSB7Ci0JCQlzZWxlY3Qoc2VsZWN0aW9uUGFydGljaXBhbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoaWRlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCUlTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KHBhcnQpOwotCQlpZiAoKHNlbGVjdGlvblBhcnRpY2lwYW50ICE9IG51bGwpICYmIChzZWxlY3Rpb25QYXJ0aWNpcGFudC5kaXNwb3NlT25IaWRlKCkpKSB7Ci0JCQljbG9zZVBhcnQocGFydCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsb3NlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCUlTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KHBhcnQpOwotCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgewotCQkJZGlzcG9zZVBhcnQocGFydCk7Ci0JCQljaGVja0Zvck5vRWRpdG9ycygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmICgocGFydCAhPSBudWxsKSAmJiAoc2VsZWN0aW9uUGFydGljaXBhbnRzLmNvbnRhaW5zS2V5KHBhcnQpKSkgewotCQkJSVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gCi0JCQkJKElTZWxlY3Rpb25QYXJ0aWNpcGFudCkgc2VsZWN0aW9uUGFydGljaXBhbnRzLnJlbW92ZShwYXJ0KTsKLQkJCXNlbGVjdGlvblBhcnRpY2lwYW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JOb0VkaXRvcnMoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoKGFjdGl2ZVBhZ2UgPT0gbnVsbCkKLQkJCQl8fCAoYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBudWxsKSkgewotCQkJc2VsZWN0KFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtYXkgYmUgdXNlZCB0byByZWdpc3RlciBhIHBhcnQgd2l0aCB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgaWYgdGhlIHBhcnQKLQkgKiBpcyBrbm93biB0byBuZWVkIGFjY2VzcyB0byB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgYmVmb3JlIGl0IGlzIGV2ZXIgYWN0aXZhdGVkCi0JICogb3IgaW4gdGhlIGNhc2UgaXQgbWF5IGJlIGFjdGl2YXRlZCBwcmlvciB0byB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgYmVpbmcgCi0JICogY3JlYXRlZC4KLQkgKiAKLQkgKiBJdCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byBkZXJlZ2lzdGVyIGEgcGFydCwgYXMgdGhhdCBoYXBwZW5zIHdoZW4gdGhlIAotCSAqIHBhcnQgaXMgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaW5pdFBhcnQocGFydCk7Ci0JfQotCQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgbGlnaHRseSwgdGhpcyB3aWxsIGFmZmVjdCB0aGUgc2VsZWN0aW9uIGZvciBhbGwgaW50ZXJlc3RlZAotCSAqIG9iamVjdHMgaW4gYSB3aW5kb3cuCi0JICogVGhlIG5ld1NlbGVjdGlvbiB3aWxsIGJlIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uLmVxdWFscyhuZXdTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWN1cnJlbnRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCWZpcmVTZWxlY3Rpb25DaGFuZ2UoCi0JCQluZXcgU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBTZWxlY3Rpb25FdmVudC5TRUxFQ1RJT04sIHRoaXMpCi0JCSk7Ci0JfQotCQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgbGlnaHRseSwgdGhpcyB3aWxsIGFmZmVjdCB0aGUgc2VsZWN0aW9uIGZvciBhbGwgaW50ZXJlc3RlZAotCSAqIG9iamVjdHMgaW4gYSB3aW5kb3cuCi0JICogVGhlIG9sZFNlbGVjdGlvbiB3aWxsIGJlIGRlc2VsZWN0ZWQsIGlmZiBpdCBtYXRjaGVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlbGVjdChTZWxlY3Rpb24gb2xkU2VsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uLmVxdWFscyhvbGRTZWxlY3Rpb24pKSB7Ci0JCQljdXJyZW50U2VsZWN0aW9uID0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQkJZmlyZVNlbGVjdGlvbkNoYW5nZSgKLQkJCQluZXcgU2VsZWN0aW9uRXZlbnQob2xkU2VsZWN0aW9uLCBTZWxlY3Rpb25FdmVudC5ERVNFTEVDVElPTiwgdGhpcykKLQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2UoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSBzZWxlY3Rpb25QYXJ0aWNpcGFudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkoKElTZWxlY3Rpb25QYXJ0aWNpcGFudCkgc3RyZWFtLm5leHQoKSkuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uUGFydGljaXBhbnQgZ2V0U2VsZWN0aW9uUGFydGljaXBhbnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4gKElTZWxlY3Rpb25QYXJ0aWNpcGFudCkgc2VsZWN0aW9uUGFydGljaXBhbnRzLmdldChwYXJ0KTsKLQl9Ci0JCQotCXB1YmxpYyBTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXdpbmRvdy5yZW1vdmVQYWdlTGlzdGVuZXIocGFnZUxpc3RlbmVyKTsKLQkJc2VsZWN0aW9uUGFydGljaXBhbnRzLmNsZWFyKCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9IG5ldyBDbG9uZUl0ZXJhdG9yKHBhZ2VzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlkaXNwb3NlUGFnZSgoSVdvcmtiZW5jaFBhZ2UpIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9IG5ldyBDbG9uZUl0ZXJhdG9yKHNlbGVjdGlvblBhcnRpY2lwYW50cy5rZXlTZXQoKSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJZGlzcG9zZVBhcnQoKElXb3JrYmVuY2hQYXJ0KSBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIFBhZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQYWdlTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHBhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkge30KLQkJCi0JCXB1YmxpYyB2b2lkIHBhZ2VDbG9zZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJZGlzcG9zZVBhZ2UocGFnZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhZ2VPcGVuZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJaW5pdFBhZ2UocGFnZSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBQYXJ0TGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyMgotCXsKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpbml0UGFydChwYXJ0KTsKLQkJCQlzZWxlY3RQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHt9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWNsb3NlUGFydChwYXJ0KTsKLQkJCQlkaXNwb3NlUGFydChwYXJ0KTsKLQkJCQljaGVja0Zvck5vRWRpdG9ycygpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikge30KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRIaWRkZW4oSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaGlkZVBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikge30KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaW5pdFBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRWaXNpYmxlKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWluaXRQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZTZlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgSU5TVEFOQ0U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IE1VVEVYID0gbmV3IE9iamVjdCgpOwotCQotCQotCS8qKgotCSAqIEVhY2ggPGNvZGU+SVdvcmtiZW5jaFdpbmRvdzwvY29kZT4gaGFzIGl0cyBvd24gPGNvZGU+U2VsZWN0aW9uTWFuYWdlcjwvY29kZT4gCi0JICogdG8gdHJhY2sgdGhlIHNlbGVjdGlvbiBldmVudHMgaW4gdGhlIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+LiBBbGwgCi0JICogPGNvZGU+SVNlbGVjdGlvbkxpc3RlbmVyPC9jb2RlPnMgaW4gdGhlIHNhbWUgPGNvZGU+SVdvcmtiZW5jaFdpbmRvdzwvY29kZT4gCi0JICogc2hhcmUgdGhlIHNhbWUgPGNvZGU+U2VsZWN0aW9uTWFuYWdlcjwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VsZWN0aW9uTWFuYWdlcjwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IAotCSAqIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU2VsZWN0aW9uTWFuYWdlciBnZXRTZWxlY3Rpb25NYW5hZ2VyKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGlzIHRocmVhZCBzYWZlIGZvciBub3cuIHlvdSBuZXZlciBrbm93IHdoYXRzIGNvbW1pbmcKLQkJCXN5bmNocm9uaXplZCAoTVVURVgpIHsKLQkJCQlpZihJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQkJCUlOU1RBTkNFID0gbmV3IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5KCk7Ci0JCQkJCS8vIGlmIHdlIGRvIHRoZSBpbml0IGluc2lkZSB0aGUgY29uc3RydWN0b3Igd2UgZW5kIHVwIGluIGEgbG9vcAotCQkJCQkvLyBiZWNhdXNlIHRoZSBhZGRXaW5kb3dMaXN0ZW5lcih0aGlzKSBkb2VzIGEgY2FsbGJhY2sgdG8gdXMKLQkJCQkJSU5TVEFOQ0UuaW5pdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0UuaW50ZXJuYWxHZXRTZWxlY3Rpb25NYW5hZ2VyKHdpbmRvdyk7Ci0JfQotCQotCQotCXByaXZhdGUgTWFwIG1hbmFnZXJzOwotCQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgd2luZG93TGlzdGVuZXI7Ci0JCi0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSgpIHsKLQkJbWFuYWdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl3aW5kb3dMaXN0ZW5lciA9IG5ldyBXaW5kb3dMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQl3b3JrYmVuY2guYWRkV2luZG93TGlzdGVuZXIod2luZG93TGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTZWxlY3Rpb25NYW5hZ2VyIGZvciB0aGUgSVdvcmtiZW5jaFdpbmRvdy4KLQkgKiBDcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0cyB5ZXQuCi0JICovCi0JcHJpdmF0ZSBTZWxlY3Rpb25NYW5hZ2VyIGludGVybmFsR2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24od2luZG93LnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlpZiAoISBtYW5hZ2Vycy5jb250YWluc0tleSh3aW5kb3cpKSB7Ci0JCQlTZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU2VsZWN0aW9uTWFuYWdlcigpOwotCQkJdGhpcy5tYW5hZ2Vycy5wdXQod2luZG93LCBtYW5hZ2VyKTsKLQkJCW1hbmFnZXIuaW5pdCh3aW5kb3cpOwotCQl9Ci0JCQotCQlyZXR1cm4gKFNlbGVjdGlvbk1hbmFnZXIpIG1hbmFnZXJzLmdldCh3aW5kb3cpOwotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIFdpbmRvd0xpc3RlbmVyIGltcGxlbWVudHMgSVdpbmRvd0xpc3RlbmVyCi0JewotCQkvKiBAc2VlIElXaW5kb3dMaXN0ZW5lciN3aW5kb3dPcGVuZWQoSVdvcmtiZW5jaFdpbmRvdykgKi8KLQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykge30KLQkJCi0JCS8qIEBzZWUgSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93KSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7Ci0JCQlTZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIgPSBpbnRlcm5hbEdldFNlbGVjdGlvbk1hbmFnZXIoYVdpbmRvdyk7Ci0JCQltYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCW1hbmFnZXJzLnJlbW92ZShhV2luZG93KTsKLQkJfQotCQkKLQkJLyogQHNlZSBJV2luZG93TGlzdGVuZXIjd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cpICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHt9Ci0JCQotCQkvKiBAc2VlIElXaW5kb3dMaXN0ZW5lciN3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93KSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHt9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzkwNzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25QYXJ0aWNpcGFudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuSnBhRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLkpwYVN0cnVjdHVyZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvblBhcnRpY2lwYW50RmFjdG9yeSAKLQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCS8qIEBzZWUgSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoT2JqZWN0LCBDbGFzcykgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKCEgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPSAKLQkJCVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIoKChJV29ya2JlbmNoUGFydCkgYWRhcHRhYmxlT2JqZWN0KS5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQkvLyBUT0RPIC0gdHVybiB0aGlzIGludG8gZXh0ZW5zaW9uIHBvaW50Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJcmV0dXJuIG5ldyBUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQoCi0JCQkJCQkJc2VsZWN0aW9uTWFuYWdlciwgKElUZXh0RWRpdG9yKSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEpwYVN0cnVjdHVyZVZpZXcpIHsKLQkJCXJldHVybiBuZXcgSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQoCi0JCQkJCQkJc2VsZWN0aW9uTWFuYWdlciwgKEpwYVN0cnVjdHVyZVZpZXcpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSnBhRGV0YWlsc1ZpZXcpIHsKLQkJCXJldHVybiBuZXcgSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50KAotCQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIsIChKcGFEZXRhaWxzVmlldykgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qIEBzZWUgSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSVNlbGVjdGlvblBhcnRpY2lwYW50LmNsYXNzIH07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1RleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1RleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzEzNzc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9UZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3MuQWJzdHJhY3RKcGFWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQgCi0JZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdGlvblBhcnRpY2lwYW50IAotewotCXByaXZhdGUgSVRleHRFZGl0b3IgZWRpdG9yOwotCQotCXByaXZhdGUgSVByb3BlcnR5TGlzdGVuZXIgZWRpdG9ySW5wdXRMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZWRpdG9yU2VsZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NOb3RpZmljYXRpb24gPSBmYWxzZTsKLQkKLQkKLQlwdWJsaWMgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50KElTZWxlY3Rpb25NYW5hZ2VyIHRoZVNlbGVjdGlvbk1hbmFnZXIsIElUZXh0RWRpdG9yIHRoZUVkaXRvcikgewotCQlzdXBlcih0aGVTZWxlY3Rpb25NYW5hZ2VyKTsKLQkJZWRpdG9yID0gdGhlRWRpdG9yOwotCQllZGl0b3JJbnB1dExpc3RlbmVyID0gbmV3IEVkaXRvcklucHV0TGlzdGVuZXIoKTsKLQkJZWRpdG9yLmFkZFByb3BlcnR5TGlzdGVuZXIoZWRpdG9ySW5wdXRMaXN0ZW5lcik7Ci0JCWVkaXRvclNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCQljdXJyZW50U2VsZWN0aW9uID0gY2FsY3VsYXRlU2VsZWN0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0b3JJbnB1dENoYW5nZWQoKSB7Ci0JCVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24gPSBjYWxjdWxhdGVTZWxlY3Rpb24oKTsKLQkJCi0JCWlmICghIG5ld1NlbGVjdGlvbi5lcXVhbHMoY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCQkKLQkJCWlmICghIHN1cHByZXNzTm90aWZpY2F0aW9uKSB7Ci0JCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3QobmV3U2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdG9yU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IGNhbGN1bGF0ZVNlbGVjdGlvbigpOwotCQkKLQkJaWYgKCEgbmV3U2VsZWN0aW9uLmVxdWFscyhjdXJyZW50U2VsZWN0aW9uKSkgewotCQkJY3VycmVudFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQkJCQotCQkJLy8gYnVnIDE4ODM0NCAtIHdvbid0IGFjdGl2ZWx5IGNoYW5nZSBzZWxlY3Rpb24gbWFuYWdlciBzZWxlY3Rpb24gaWYgCi0JCQkvLyBhICJKUEEiIHZpZXcgaXMgdGhlIGFjdGl2ZSAoYW5kIHByZXN1bWFibHkgc2VsZWN0aW5nKSB2aWV3Ci0JCQlpZiAoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlUGFydCgpIGluc3RhbmNlb2YgQWJzdHJhY3RKcGFWaWV3KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAoISBzdXBwcmVzc05vdGlmaWNhdGlvbikgewotCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ld1NlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb24gY2FsY3VsYXRlU2VsZWN0aW9uKCkgewotCQlpZiAoZWRpdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCX0KLQkJCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlKcGFGaWxlIHBlcnNpc3RlbmNlRmlsZSA9IHBlcnNpc3RlbmNlRmlsZUZvcihlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQotCQlpZiAoKHBlcnNpc3RlbmNlRmlsZSA9PSBudWxsKQotCQkJfHwgKCEgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSkpIHsKLQkJCXJldHVybiBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCX0KLQkJCi0JCUlKcGFDb250ZW50Tm9kZSBzZWxlY3RlZE5vZGUgPSBwZXJzaXN0ZW5jZUZpbGUuZ2V0Q29udGVudE5vZGUoKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKSk7Ci0JCWlmIChzZWxlY3RlZE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJfQotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbihzZWxlY3RlZE5vZGUpOwotCX0KLQkKLQlwdWJsaWMgU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyBJSnBhRmlsZSBwZXJzaXN0ZW5jZUZpbGVGb3IoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpbGVJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCWZpbGUgPSBmaWxlSW5wdXQuZ2V0RmlsZSgpOwotCQl9Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQlTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gZXZ0LmdldFNlbGVjdGlvbigpOwotCQkKLQkJaWYgKChnZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3U2VsZWN0aW9uKSkKLQkJCXx8IChuZXdTZWxlY3Rpb24gPT0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzdXBwcmVzc05vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCUlKcGFDb250ZW50Tm9kZSBzZWxlY3RlZE5vZGUgPSBuZXdTZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0JCQotCQlJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHNlbGVjdGVkTm9kZS5zZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmVkaXRvci5zZWxlY3RBbmRSZXZlYWwodGV4dFJhbmdlLmdldE9mZnNldCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCXN1cHByZXNzTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc3Bvc2VPbkhpZGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMuZWRpdG9ySW5wdXRMaXN0ZW5lcik7Ci0JCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgdGhpcy5lZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihlZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgRWRpdG9ySW5wdXRMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElQcm9wZXJ0eUxpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotCQkJaWYgKChlZGl0b3IgPT0gc291cmNlKSAmJiAocHJvcElkID09IElFZGl0b3JQYXJ0LlBST1BfSU5QVVQpKSB7Ci0JCQkJZWRpdG9ySW5wdXRDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgCi0JewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJZWRpdG9yU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSUpwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSUpwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODk5Y2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0lKcGFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpwYVN0cnVjdHVyZVByb3ZpZGVyIAotewotCi0JU3RyaW5nIGZpbGVDb250ZW50VHlwZSgpOwotCQotCS8qKgotCSAqIEJ1aWxkIGFuIG91dGxpbmUgY29udGVudCBwcm92aWRlci4KLQkgKi8KLQlJVHJlZUNvbnRlbnRQcm92aWRlciBidWlsZENvbnRlbnRQcm92aWRlcigpOwotCQotCS8qKgotCSAqIEJ1aWxkIGFuIG91dGxpbmUgbGFiZWwgcHJvdmlkZXIuCi0JICovCi0JSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCk7Ci0JCi0Jdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjE0MDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotLy9jb3BpZWQgZnJvbSBqZHQuaW50ZXJuYWwudWkudXRpbAotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFibGVIZWlnaHRIaW50KFRhYmxlIHRhYmxlLCBpbnQgcm93cykgewotCQlpZiAodGFibGUuZ2V0Rm9udCgpLmVxdWFscyhKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpKSkKLQkJCXRhYmxlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJaW50IHJlc3VsdD0gdGFibGUuZ2V0SXRlbUhlaWdodCgpICogcm93cyArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpOwotCQlpZiAodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpCi0JCQlyZXN1bHQrPSB0YWJsZS5nZXRHcmlkTGluZVdpZHRoKCkgKiAocm93cyAtIDEpOwotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3V0aWwvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1MTM0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5QaXhlbERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotCi0vKioKLSAqIEEgc3BlY2lhbCBjb21wb3NpdGUgdG8gbGF5b3V0IGNvbHVtbnMgaW5zaWRlIGEgdGFibGUuIFRoZSBjb21wb3NpdGUgaXMgbmVlZGVkIHNpbmNlIHdlIGhhdmUKLSAqIHRvIGxheW91dCB0aGUgY29sdW1ucyAiYmVmb3JlIiB0aGUgYWN0dWFsIHRhYmxlIGdldHMgbGF5b3V0ZWQuIEhlbmNlIHdlIGNhbid0IHVzZSBhIG5vcm1hbAotICogbGF5b3V0IG1hbmFnZXIuCi0gKiAKLSAqIGNvcGllZCBmcm9tIGpkdC5pbnRlcm5hbC51aS51dGlsCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUxheW91dENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGV4dHJhIHBpeGVscyB0YWtlbiBhcyBob3Jpem9udGFsIHRyaW0gYnkgdGhlIHRhYmxlIGNvbHVtbi4gCi0JICogVG8gZW5zdXJlIHRoZXJlIGFyZSBOIHBpeGVscyBhdmFpbGFibGUgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4sCi0JICogYXNzaWduIE4rQ09MVU1OX1RSSU0gZm9yIHRoZSBjb2x1bW4gd2lkdGguCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBDT0xVTU5fVFJJTSA9ICJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkgPyAyNCA6IDM7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIExpc3QgY29sdW1ucz0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUxheW91dENvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIFRhYmxlTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGFyZWE9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZT0gKFRhYmxlKWdldENoaWxkcmVuKClbMF07Ci0gICAgICAgICAgICAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZT0gY29tcHV0ZVRhYmxlU2l6ZSh0YWJsZSk7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGggLT0gdkJhclNpemUueDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGF5b3V0VGFibGUodGFibGUsIHdpZHRoLCBhcmVhLCB0YWJsZS5nZXRTaXplKCkueCA8IGFyZWEud2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBhIG5ldyBjb2x1bW4gb2YgZGF0YSB0byB0aGlzIHRhYmxlIGxheW91dC4KLQkgKgotCSAqIEBwYXJhbSBkYXRhIHRoZSBjb2x1bW4gbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5EYXRhKENvbHVtbkxheW91dERhdGEgZGF0YSkgewotCQljb2x1bW5zLmFkZChkYXRhKTsKLQl9Ci0JCi0JLy8tLS0tIEhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVRhYmxlU2l6ZShUYWJsZSB0YWJsZSkgewotCQlQb2ludCByZXN1bHQ9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQotCQlpbnQgd2lkdGg9IDA7Ci0JCWludCBzaXplPSBjb2x1bW5zLnNpemUoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXREYXRhPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjb2w9IChDb2x1bW5QaXhlbERhdGEpIGxheW91dERhdGE7Ci0JCQkJd2lkdGggKz0gY29sLndpZHRoOwotCQkJCWlmIChjb2wuYWRkVHJpbSkgewotCQkJCQl3aWR0aCArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2w9IChDb2x1bW5XZWlnaHREYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC5taW5pbXVtV2lkdGg7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoID4gcmVzdWx0LngpCi0JCQlyZXN1bHQueD0gd2lkdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsYXlvdXRUYWJsZShUYWJsZSB0YWJsZSwgaW50IHdpZHRoLCBSZWN0YW5nbGUgYXJlYSwgYm9vbGVhbiBpbmNyZWFzZSkgewotCQkvLyBYWFg6IExheW91dCBpcyBiZWluZyBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlIHRoZSBmaXJzdCB0aW1lCi0JCS8vIGl0IGlzIGJlaW5nIGNhbGxlZCBvbiBMaW51eC4gVGhpcyBtZXRob2QgcmVzZXRzIHRoZQotCQkvLyBMYXlvdXQgdG8gbnVsbCBzbyB3ZSBtYWtlIHN1cmUgd2UgcnVuIGl0IG9ubHkgd2hlbgotCQkvLyB0aGUgdmFsdWUgaXMgT0suCi0JCWlmICh3aWR0aCA8PSAxKQotCQkJcmV0dXJuOwotCi0JCVRhYmxlQ29sdW1uW10gdGFibGVDb2x1bW5zPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWludCBzaXplPSBNYXRoLm1pbihjb2x1bW5zLnNpemUoKSwgdGFibGVDb2x1bW5zLmxlbmd0aCk7Ci0JCWludFtdIHdpZHRocz0gbmV3IGludFtzaXplXTsKLQkJaW50IGZpeGVkV2lkdGg9IDA7Ci0JCWludCBudW1iZXJPZldlaWdodENvbHVtbnM9IDA7Ci0JCWludCB0b3RhbFdlaWdodD0gMDsKLQotCQkvLyBGaXJzdCBjYWxjIHNwYWNlIG9jY3VwaWVkIGJ5IGZpeGVkIGNvbHVtbnMKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKLQkJCQlDb2x1bW5QaXhlbERhdGEgY3BkPSAoQ29sdW1uUGl4ZWxEYXRhKSBjb2w7Ci0JCQkJaW50IHBpeGVscz0gY3BkLndpZHRoOwotCQkJCWlmIChjcGQuYWRkVHJpbSkgewotCQkJCQlwaXhlbHMgKz0gQ09MVU1OX1RSSU07Ci0JCQkJfQotCQkJCXdpZHRoc1tpXT0gcGl4ZWxzOwotCQkJCWZpeGVkV2lkdGggKz0gcGl4ZWxzOwotCQkJfSBlbHNlIGlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjdz0gKENvbHVtbldlaWdodERhdGEpIGNvbDsKLQkJCQludW1iZXJPZldlaWdodENvbHVtbnMrKzsKLQkJCQkvLyBmaXJzdCB0aW1lLCB1c2UgdGhlIHdlaWdodCBzcGVjaWZpZWQgYnkgdGhlIGNvbHVtbiBkYXRhLCBvdGhlcndpc2UgdXNlIHRoZSBhY3R1YWwgd2lkdGggYXMgdGhlIHdlaWdodAotCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQlpbnQgd2VpZ2h0PSBjdy53ZWlnaHQ7Ci0JCQkJdG90YWxXZWlnaHQgKz0gd2VpZ2h0OwotCQkJfSBlbHNlIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gRG8gd2UgaGF2ZSBjb2x1bW5zIHRoYXQgaGF2ZSBhIHdlaWdodAotCQlpZiAobnVtYmVyT2ZXZWlnaHRDb2x1bW5zID4gMCkgewotCQkJLy8gTm93IGRpc3RyaWJ1dGUgdGhlIHJlc3QgdG8gdGhlIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgcmVzdD0gd2lkdGggLSBmaXhlZFdpZHRoOwotCQkJaW50IHRvdGFsRGlzdHJpYnV0ZWQ9IDA7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IGFzIGFib3ZlCi0JCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCQlpbnQgcGl4ZWxzPSB0b3RhbFdlaWdodCA9PSAwID8gMCA6IHdlaWdodCAqIHJlc3QgLyB0b3RhbFdlaWdodDsKLQkJCQkJaWYgKHBpeGVscyA8IGN3Lm1pbmltdW1XaWR0aCkKLQkJCQkJCXBpeGVscz0gY3cubWluaW11bVdpZHRoOwotCQkJCQl0b3RhbERpc3RyaWJ1dGVkICs9IHBpeGVsczsKLQkJCQkJd2lkdGhzW2ldPSBwaXhlbHM7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBEaXN0cmlidXRlIGFueSByZW1haW5pbmcgcGl4ZWxzIHRvIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgZGlmZj0gcmVzdCAtIHRvdGFsRGlzdHJpYnV0ZWQ7Ci0JCQlmb3IgKGludCBpPSAwOyBkaWZmID4gMDsgKytpKSB7Ci0JCQkJaWYgKGkgPT0gc2l6ZSkKLQkJCQkJaT0gMDsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJCSsrd2lkdGhzW2ldOwotCQkJCQktLWRpZmY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRhYmxlQ29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aHNbaV0pOwotCQl9Ci0JCWlmICghaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvQWJzdHJhY3RKcGFWaWV3LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkN2NmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IFZlcnNhbnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogVmVyc2FudCBhbmQgT3RoZXJzLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLklTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhVmlldyBleHRlbmRzIFZpZXdQYXJ0IAotewkKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBkZWZhdWx0Q29tcG9zaXRlOwotCQotCQotCS8qKgotCSAqIFRoZSBzdHJpbmcgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGlzIG5vIHZpZXcgY29udGVudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRMYWJlbDsKLQkKLQlwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7Ci0JCi0JCi0JcHVibGljIEFic3RyYWN0SnBhVmlldyhTdHJpbmcgYURlZmF1bHRMYWJlbCkgewotCQlzdXBlcigpOwotCQlkZWZhdWx0TGFiZWwgPSBhRGVmYXVsdExhYmVsOwotCQl0aGlzLndpZGdldEZhY3RvcnkgPSBuZXcgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkoKTsKLQl9Ci0JCi0JLyogQHNlZSBJV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJZGVmYXVsdENvbXBvc2l0ZSA9IGJ1aWxkRGVmYXVsdENvbXBvc2l0ZSgpOwotCQlwYWdlQm9vay5zaG93UGFnZShkZWZhdWx0Q29tcG9zaXRlKTsKLQkJCi0JCXN1YmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0JCQotCQlJU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gCi0JCQlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQlzZWxlY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpOwotCQlzZWxlY3Qoc2VsZWN0aW9uTWFuYWdlci5nZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzdWJjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIG5vIG9wIC0gZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgaWYgd2lzaGVkCi0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkRGVmYXVsdENvbXBvc2l0ZSgpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJTGFiZWwgbGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBkZWZhdWx0TGFiZWwpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWxlY3QoU2VsZWN0aW9uIGFTZWxlY3Rpb24pOwotCQotCXByb3RlY3RlZCB2b2lkIHNob3dEZWZhdWx0UGFnZSgpIHsKLQkJcGFnZUJvb2suc2hvd1BhZ2UoZGVmYXVsdENvbXBvc2l0ZSk7Ci0JfQotCQotCS8qIEBzZWUgSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlwYWdlQm9vay5zZXRGb2N1cygpOwotCX0KLQkKLQlwdWJsaWMgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2NTRmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFEZXRhaWxzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5QbGF0Zm9ybVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEpwYURldGFpbHNWaWV3IGV4dGVuZHMgQWJzdHJhY3RKcGFWaWV3IAotewkKLQlwcml2YXRlIFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotCQotCXByaXZhdGUgSUpwYURldGFpbHNQYWdlIGN1cnJlbnRQYWdlOwotCQotCS8qIGtleTogU3RyaW5nIGZpbGUgY29udGVudCBpZCwgIHZhbHVlOiBJSnBhRGV0YWlsc1Byb3ZpZGVyICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJSnBhRGV0YWlsc1Byb3ZpZGVyPiBkZXRhaWxzUHJvdmlkZXJzOwotCQotCS8qIGtleTogT2JqZWN0IGNvbnRlbnQgbm9kZSBpZCwgIHZhbHVlOiBDb21wb3NpdGUgcGFnZSAqLwotCXByaXZhdGUgTWFwPE9iamVjdCwgSUpwYURldGFpbHNQYWdlPiBkZXRhaWxzUGFnZXM7Ci0JCi0JcHVibGljIEpwYURldGFpbHNWaWV3KCkgewotCQlzdXBlcihKcHRVaU1lc3NhZ2VzLkpwYURldGFpbHNWaWV3X3ZpZXdOb3RBdmFpbGFibGUpOwotCQl0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCXRoaXMuZGV0YWlsc1Byb3ZpZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUpwYURldGFpbHNQcm92aWRlcj4oKTsKLQkJdGhpcy5kZXRhaWxzUGFnZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIElKcGFEZXRhaWxzUGFnZT4oKTsKLQl9Ci0JCi0JCi0JcHVibGljIFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgewotCQlpZiAobmV3U2VsZWN0aW9uLmVxdWFscyhjdXJyZW50U2VsZWN0aW9uKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQljdXJyZW50U2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQkKLQkJaWYgKG5ld1NlbGVjdGlvbiAhPSBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pIHsKLQkJCUlKcGFDb250ZW50Tm9kZSBuZXdOb2RlID0gbmV3U2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpOwotCQkJSUpwYURldGFpbHNQYWdlIG5ld1BhZ2UgPSBnZXREZXRhaWxzUGFnZShuZXdOb2RlKTsKLQkJCXNldEN1cnJlbnRQYWdlKG5ld1BhZ2UpOwotCQl9Ci0JCWVsc2UgaWYgKGN1cnJlbnRTZWxlY3Rpb24gIT0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OKSB7Ci0JCQlzZXRDdXJyZW50UGFnZShudWxsKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElKcGFEZXRhaWxzUGFnZSBnZXREZXRhaWxzUGFnZShJSnBhQ29udGVudE5vZGUgY29udGVudE5vZGUpIHsKLQkJaWYgKGRldGFpbHNQYWdlcy5jb250YWluc0tleShjb250ZW50Tm9kZS5nZXRJZCgpKSkgewotCQkJSUpwYURldGFpbHNQYWdlIHBhZ2UgPSAgZGV0YWlsc1BhZ2VzLmdldChjb250ZW50Tm9kZS5nZXRJZCgpKTsKLQkJCQotCQkJaWYgKChwYWdlICE9IG51bGwpICYmCi0JCQkJCShwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJZGV0YWlsc1BhZ2VzLnJlbW92ZShjb250ZW50Tm9kZS5nZXRJZCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBwYWdlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gYnVpbGREZXRhaWxzUGFnZShjb250ZW50Tm9kZSk7Ci0JfQotCQotCXByaXZhdGUgSUpwYURldGFpbHNQYWdlIGJ1aWxkRGV0YWlsc1BhZ2UoSUpwYUNvbnRlbnROb2RlIGNvbnRlbnROb2RlKSB7Ci0JCUlKcGFEZXRhaWxzUHJvdmlkZXIgZGV0YWlsc1Byb3ZpZGVyID0KLQkJCQkJZ2V0RGV0YWlsc1Byb3ZpZGVyKGNvbnRlbnROb2RlKTsKLQkJCQotCQlpZiAoZGV0YWlsc1Byb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCXBhcmVudENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCUlKcGFEZXRhaWxzUGFnZSBwYWdlID0gCi0JCQlkZXRhaWxzUHJvdmlkZXIuYnVpbGREZXRhaWxzUGFnZShwYXJlbnRDb21wb3NpdGUsIGNvbnRlbnROb2RlLmdldElkKCksIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlkZXRhaWxzUGFnZXMucHV0KGNvbnRlbnROb2RlLmdldElkKCksIHBhZ2UpOwotCQl9Ci0JCQotCQlyZXR1cm4gcGFnZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSnBhRGV0YWlsc1Byb3ZpZGVyIGdldERldGFpbHNQcm92aWRlcihJSnBhQ29udGVudE5vZGUgY29udGVudE5vZGUpIHsKLQkJU3RyaW5nIGNvbnRlbnRJZCA9IGNvbnRlbnROb2RlLmdldEpwYUZpbGUoKS5nZXRDb250ZW50SWQoKTsKLQkJSUpwYURldGFpbHNQcm92aWRlciBwcm92aWRlciA9IGRldGFpbHNQcm92aWRlcnMuZ2V0KGNvbnRlbnRJZCk7Ci0JCQotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBsYXRmb3JtSWQgPSBjb250ZW50Tm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0UGxhdGZvcm0oKS5nZXRJZCgpOwotCQkJSUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VSSA9IFBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SnBhUGxhdGZvcm0ocGxhdGZvcm1JZCk7Ci0JCQlmb3IgKElKcGFEZXRhaWxzUHJvdmlkZXIgcCA6IGpwYVBsYXRmb3JtVUkuZGV0YWlsc1Byb3ZpZGVycygpKSB7Ci0JCQkJaWYgKHAuZmlsZUNvbnRlbnRUeXBlKCkuZXF1YWxzKGNvbnRlbnRJZCkpIHsKLQkJCQkJcHJvdmlkZXIgPSBwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vVE9ETyB0aGlzIHZpZXcgYW5kIHRoZSBkZXRhaWxzUHJvdmlkZXJzIE1hcCBpcyBub3QgY3JlYXRlZCBvbiBhIHBlciBwcm9qZWN0IGJhc2lzLgotCQkJLy90aGUgZGV0YWlsc1Byb3ZpZGVycyBhbmQgdGhlaXIgZmlsZUNvbnRlbnRUeXBlcyBjb3VsZCBvdmVybGFwIGFjcm9zcyBwcm9qZWN0LCB0aGlzIHdvdWxkIGNhdXNlIHByb2JsZW1zIHdpdGggc3RvcmluZyB0aGlzIG1hcC4KLQkJCQotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlkZXRhaWxzUHJvdmlkZXJzLnB1dChjb250ZW50SWQsIHByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb3ZpZGVyOwkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRQYWdlKElKcGFEZXRhaWxzUGFnZSBuZXdQYWdlKSB7Ci0JCS8vIGRlcG9wdWxhdGUgb2xkIHBhZ2UKLQkJaWYgKChjdXJyZW50UGFnZSAhPSBudWxsKSAmJiAoY3VycmVudFBhZ2UgIT0gbmV3UGFnZSkpIHsKLQkJCWN1cnJlbnRQYWdlLnBvcHVsYXRlKG51bGwpOwotCQl9Ci0JCQotCQkvLyBwb3B1bGF0ZSBuZXcgcGFnZQotCQlpZiAobmV3UGFnZSAhPSBudWxsKSB7Ci0JCQluZXdQYWdlLnBvcHVsYXRlKGN1cnJlbnRTZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCkpOwotCQl9Ci0JCQotCQljdXJyZW50UGFnZSA9IG5ld1BhZ2U7Ci0JCQotCQkvLyBzaG93IG5ldyBwYWdlCi0JCWlmIChuZXdQYWdlID09IG51bGwpIHsKLQkJCXNob3dEZWZhdWx0UGFnZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcGFnZUJvb2suc2hvd1BhZ2UobmV3UGFnZS5nZXRDb250cm9sKCkuZ2V0UGFyZW50KCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KGRldGFpbHNQcm92aWRlcnMua2V5U2V0KCkpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBrZXkgPSBzdHJlYW0ubmV4dCgpOwotCQkJSUpwYURldGFpbHNQcm92aWRlciBwcm92aWRlciA9IGRldGFpbHNQcm92aWRlcnMucmVtb3ZlKGtleSk7Ci0JCQlwcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBuZXcgQ2xvbmVJdGVyYXRvcjxPYmplY3Q+KGRldGFpbHNQYWdlcy5rZXlTZXQoKSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IGtleSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlJSnBhRGV0YWlsc1BhZ2UgZGV0YWlsc1BhZ2UgPSBkZXRhaWxzUGFnZXMucmVtb3ZlKGtleSk7Ci0JCQlkZXRhaWxzUGFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWN1cnJlbnRTZWxlY3Rpb24gPSBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCWN1cnJlbnRQYWdlID0gbnVsbDsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhU3RydWN0dXJlVmlldy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhU3RydWN0dXJlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTRhZGEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL0pwYVN0cnVjdHVyZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuUGxhdGZvcm1SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2UuTnVsbExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLk51bGxUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSUpwYVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTdHJ1Y3R1cmVWaWV3IGV4dGVuZHMgQWJzdHJhY3RKcGFWaWV3IAotewotCXByaXZhdGUgU3RydWN0dXJlQ29tcG9zaXRlIHN0cnVjdHVyZUNvbXBvc2l0ZTsKLQkKLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlVmlldygpIHsKLQkJc3VwZXIoSnB0VWlNZXNzYWdlcy5KcGFTdHJ1Y3R1cmVWaWV3X3ZpZXdOb3RBdmFpbGFibGUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdWJjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN0cnVjdHVyZUNvbXBvc2l0ZSA9IAotCQkJbmV3IFN0cnVjdHVyZUNvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCX0KLQkJCi0JcHVibGljIFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCWlmIChzdHJ1Y3R1cmVDb21wb3NpdGUuaXNWaXNpYmxlKCkpIHsKLQkJCXJldHVybiBzdHJ1Y3R1cmVDb21wb3NpdGUuZ2V0U2VsZWN0aW9uKCk7IAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgewotCQlTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkKLQkJaWYgKG5ld1NlbGVjdGlvbi5lcXVhbHMoY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKG5ld1NlbGVjdGlvbiA9PSBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pIHsKLQkJCXNob3dEZWZhdWx0UGFnZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcGFnZUJvb2suc2hvd1BhZ2Uoc3RydWN0dXJlQ29tcG9zaXRlKTsKLQkJfQotCQkKLQkJc3RydWN0dXJlQ29tcG9zaXRlLnNlbGVjdChuZXdTZWxlY3Rpb24pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdHJ1Y3R1cmVDb21wb3NpdGUudmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN0cnVjdHVyZUNvbXBvc2l0ZS52aWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBTdHJ1Y3R1cmVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgCi0JewotCQkvKiBrZXk6IFN0cmluZyBmaWxlIGNvbnRlbnQgaWQsICB2YWx1ZTogSUpwYVN0cnVjdHVyZVByb3ZpZGVyICovCi0JCXByaXZhdGUgTWFwIHN0cnVjdHVyZVByb3ZpZGVyczsKLQkJCi0JCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3ZXI7Ci0JCQotCQlwcml2YXRlIFN0cnVjdHVyZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkJCi0JCQlzdHJ1Y3R1cmVQcm92aWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCi0JCQl0aGlzLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodGhpcywgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJCXZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoMik7Ci0JCQlpbml0Q29udGV4dE1lbnUoKTsKLQkJfQotCQkKLQkgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRNZW51KCkgewotCSAgICAgICAgLy8gQ3JlYXRlIGR5bmFtaWMgbWVudSBtZ3IuICBEeW5hbWljIGlzIGN1cnJlbnRseSByZXF1aXJlZCB0bwotCSAgICAgICAgLy8gc3VwcG9ydCBhY3Rpb24gY29udHJpYnV0aW9ucy4KLQkgICAgICAgIE1lbnVNYW5hZ2VyIG1nciA9IG5ldyBNZW51TWFuYWdlcigpOwotCSAgICAgICAgbWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkgICAgICAgIG1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZ3IpIHsKLQkgICAgICAgICAgICAgICAgZmlsbENvbnRleHRNZW51KG1ncik7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfSk7Ci0JICAgICAgICBNZW51IG1lbnUgPSBtZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JICAgICAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZ3IsIHZpZXdlcik7Ci0JICAgICAgIAkgICAgICAgIAotCSAgICB9CQotCSAgICAKLQkgICAgLyoqCi0JICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gb3Blbi4KLQkgICAgICogRGVsZWdhdGVzIHRvIHRoZSBhY3Rpb24gZ3JvdXAgdXNpbmcgdGhlIHZpZXdlcidzIHNlbGVjdGlvbiBhcyB0aGUgYWN0aW9uIGNvbnRleHQuCi0JICAgICAqIEBzaW5jZSAyLjAKLQkgICAgICovCi0JICAgIHByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCSAgICB9Ci0JICAgIAotCQlwcml2YXRlIFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQlJVHJlZVNlbGVjdGlvbiB2aWV3ZXJTZWxlY3Rpb24gPSAoSVRyZWVTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQotCQkJaWYgKHZpZXdlclNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgdmlld2VyU2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQlpZiAodmlld2VyLmdldElucHV0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb24oKElKcGFDb250ZW50Tm9kZSkgdmlld2VyLmdldElucHV0KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb24oKElKcGFDb250ZW50Tm9kZSkgdmlld2VyU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2VsZWN0KFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCS8vIG5vdGU6IGNoZWNrcyBmb3IgbnVsbCBhbmQgZXF1YWxzKCkgc2VsZWN0aW9uIGhhdmUgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZAotCQkJCi0JCQlpZiAoc2VsZWN0aW9uLmVxdWFscyhTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pKSB7Ci0JCQkJY2xlYXJWaWV3ZXIoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJSnBhQ29udGVudE5vZGUgbmV3Tm9kZSA9IHNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKTsKLQkJCUlKcGFGaWxlIG5ld0ZpbGUgPSBuZXdOb2RlLmdldEpwYUZpbGUoKTsKLQkJCUlKcGFDb250ZW50Tm9kZSBjdXJyZW50Tm9kZSA9IAotCQkJCShjdXJyZW50U2VsZWN0aW9uID09IFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTikgPwotCQkJCQkJbnVsbCA6IGdldFNlbGVjdGlvbigpLmdldFNlbGVjdGVkTm9kZSgpOwotCQkJSUpwYUZpbGUgY3VycmVudEZpbGUgPSAKLQkJCQkoY3VycmVudE5vZGUgPT0gbnVsbCkgPyAKLQkJCQkJCW51bGwgOiBjdXJyZW50Tm9kZS5nZXRKcGFGaWxlKCk7Ci0JCQkKLQkJCWlmIChuZXdGaWxlLmVxdWFscyhjdXJyZW50RmlsZSkpIHsKLQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld05vZGUpLCB0cnVlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnRGaWxlICE9IG51bGwgJiYgIG5ld0ZpbGUuZ2V0Q29udGVudElkKCkuZXF1YWxzKGN1cnJlbnRGaWxlLmdldENvbnRlbnRJZCgpKSkgewotCQkJCXZpZXdlci5zZXRJbnB1dChuZXdGaWxlLmdldENvbnRlbnQoKSk7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdOb2RlKSwgdHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBuZXcgY29udGVudCB0eXBlCi0JCQkJLy8gcmVwbGFjZSBjb21wb3NpdGUgYW5kIHNldCBzZWxlY3Rpb24gb2YgdHJlZQotCQkJCUlKcGFTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlciA9IGdldFN0cnVjdHVyZVByb3ZpZGVyKG5ld05vZGUpOwotCQkJCQotCQkJCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJCWNsZWFyVmlld2VyKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyLmJ1aWxkQ29udGVudFByb3ZpZGVyKCkpOwotCQkJCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlci5idWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCQkJCXZpZXdlci5zZXRJbnB1dChuZXdGaWxlLmdldENvbnRlbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY2xlYXJWaWV3ZXIoKSB7Ci0JCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKE51bGxUcmVlQ29udGVudFByb3ZpZGVyLklOU1RBTkNFKTsKLQkJCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKE51bGxMYWJlbFByb3ZpZGVyLklOU1RBTkNFKTsKLQkJCXZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoSUpwYUNvbnRlbnROb2RlIGNvbnRlbnROb2RlKSB7Ci0JCQlTdHJpbmcgY29udGVudElkID0gY29udGVudE5vZGUuZ2V0SnBhRmlsZSgpLmdldENvbnRlbnRJZCgpOwotCQkJSUpwYVN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gCi0JCQkJKElKcGFTdHJ1Y3R1cmVQcm92aWRlcikgc3RydWN0dXJlUHJvdmlkZXJzLmdldChjb250ZW50SWQpOwotCQkJCi0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCVN0cmluZyB2ZW5kb3JJZCA9IGNvbnRlbnROb2RlLmdldEpwYVByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLmdldElkKCk7Ci0JCQkJSUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VSSA9IFBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SnBhUGxhdGZvcm0odmVuZG9ySWQpOwotCQkJCWZvciAoSUpwYVN0cnVjdHVyZVByb3ZpZGVyIHAgOiBqcGFQbGF0Zm9ybVVJLnN0cnVjdHVyZVByb3ZpZGVycygpKSB7Ci0JCQkJCWlmIChwLmZpbGVDb250ZW50VHlwZSgpLmVxdWFscyhjb250ZW50SWQpKSB7Ci0JCQkJCQlwcm92aWRlciA9IHA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvL1RPRE8gdGhpcyB2aWV3IGFuZCB0aGUgZGV0YWlsc1Byb3ZpZGVycyBNYXAgaXMgbm90IGNyZWF0ZWQgb24gYSBwZXIgcHJvamVjdCBiYXNpcy4KLQkJCQkvL3RoZSBkZXRhaWxzUHJvdmlkZXJzIGFuZCB0aGVpciBmaWxlQ29udGVudFR5cGVzIGNvdWxkIG92ZXJsYXAgYWNyb3NzIHByb2plY3QsIHRoaXMgd291bGQgY2F1c2UgcHJvYmxlbXMgd2l0aCBzdG9yaW5nIHRoaXMgbWFwLgkJCQkKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlzdHJ1Y3R1cmVQcm92aWRlcnMucHV0KGNvbnRlbnRJZCwgcHJvdmlkZXIpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIHByb3ZpZGVyOwkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ0NvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NDb21ib1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRhZGQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvQ0NvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8vYnVnICM2OTI1NCBpcyB3aHkgaSBjcmVhdGVkIHRoaXMgY2xhc3MsIGl0IGlzIGEgY29weSBvZiBDb21ib1Zpd2VyIGJ1dCB1c2luZyBhIENDb21ibwotCi0vKioKLSAqIEEgY29uY3JldGUgdmlld2VyIGJhc2VkIG9uIGFuIFNXVCA8Y29kZT5Db21ibzwvY29kZT4gY29udHJvbC4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZAotICogYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIEpGYWNlIDxjb2RlPkxpc3RWaWV3ZXI8L2NvZGU+LCB3aGljaCBkaXNwbGF5cyBpdHMgY29udGVudAotICogaW4gYSBjb21ibyBib3ggcmF0aGVyIHRoYW4gYSBsaXN0LiBXaGVyZXZlciBwb3NzaWJsZSwgdGhpcyBjbGFzcyBhdHRlbXB0cyB0byBiZWhhdmUKLSAqIGxpa2UgTGlzdFZpZXdlci4gPHA+Ci0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGggYSBwcmUtZXhpc3RpbmcgU1dUIGNvbWJvIGNvbnRyb2wgCi0gKiBhbmQgY29uZmlndXJlZCB3aXRoIGEgZG9tYWluLXNwZWNpZmljIGNvbnRlbnQgcHJvdmlkZXIsIGxhYmVsIHByb3ZpZGVyLCBlbGVtZW50Ci0gKiBmaWx0ZXIgKG9wdGlvbmFsKSwgYW5kIGVsZW1lbnQgc29ydGVyIChvcHRpb25hbCkuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDQ29tYm9WaWV3ZXIgZXh0ZW5kcyBBYnN0cmFjdExpc3RWaWV3ZXIgewotCi0gICAgLyoqCi0gICAgICogVGhpcyB2aWV3ZXIncyBsaXN0IGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDQ29tYm8gY29tYm87Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tYm8gdmlld2VyIG9uIGEgbmV3bHktY3JlYXRlZCBjb21ibyBjb250cm9sIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbWJvIHZpZXdlciBvbiBhIG5ld2x5LWNyZWF0ZWQgY29tYm8gY29udHJvbCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqIFRoZSBjb21ibyBjb250cm9sIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIGdpdmVuIFNXVCBzdHlsZSBiaXRzLgotICAgICAqIFRoZSB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIAotICAgICAqIG5vIHNvcnRlciwgYW5kIG5vIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqIEBwYXJhbSBzdHlsZSB0aGUgU1dUIHN0eWxlIGJpdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQ0NvbWJvVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICB0aGlzKG5ldyBDQ29tYm8ocGFyZW50LCBzdHlsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb21ibyB2aWV3ZXIgb24gdGhlIGdpdmVuIGNvbWJvIGNvbnRyb2wuCi0gICAgICogVGhlIHZpZXdlciBoYXMgbm8gaW5wdXQsIG5vIGNvbnRlbnQgcHJvdmlkZXIsIGEgZGVmYXVsdCBsYWJlbCBwcm92aWRlciwgCi0gICAgICogbm8gc29ydGVyLCBhbmQgbm8gZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0IHRoZSBjb21ibyBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENDb21ib1ZpZXdlcihDQ29tYm8gbGlzdCkgewotICAgICAgICB0aGlzLmNvbWJvID0gbGlzdDsKLSAgICAgICAgaG9va0NvbnRyb2wobGlzdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdEFkZChTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgY29tYm8uYWRkKHN0cmluZywgaW5kZXgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RTZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotICAgICAgICBjb21iby5zZXRJdGVtKGluZGV4LCBzdHJpbmcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnRbXSBsaXN0R2V0U2VsZWN0aW9uSW5kaWNlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGxpc3RHZXRJdGVtQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBjb21iby5nZXRJdGVtQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0U2V0SXRlbXMoU3RyaW5nW10gbGFiZWxzKSB7Ci0gICAgICAgIGNvbWJvLnNldEl0ZW1zKGxhYmVscyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdFJlbW92ZUFsbCgpIHsKLSAgICAgICAgY29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdFJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgY29tYm8ucmVtb3ZlKGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFZpZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotICAgICAgICByZXR1cm4gY29tYm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzIGxpc3Qgdmlld2VyJ3MgbGlzdCBjb250cm9sLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBjb250cm9sCi0gICAgICovCi0gICAgcHVibGljIENDb21ibyBnZXRDb21ibygpIHsKLSAgICAgICAgcmV0dXJuIGNvbWJvOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRG8gbm90aGluZyAtLSBjb21ib3Mgb25seSBkaXNwbGF5IHRoZSBzZWxlY3RlZCBlbGVtZW50LCBzbyB0aGVyZSBpcyBubyB3YXkKLSAgICAgKiB3ZSBjYW4gZW5zdXJlIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdmlzaWJsZSB3aXRob3V0IGNoYW5naW5nIHRoZSBzZWxlY3Rpb24uCi0gICAgICogTWV0aG9kIGRlZmluZWQgb24gU3RydWN0dXJlZFZpZXdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXZlYWwoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyI2xpc3RTZWxlY3RBbmRTaG93KGludFtdKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RTZXRTZWxlY3Rpb24oaW50W10gaXhzKSB7Ci0gICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGl4cy5sZW5ndGg7IGlkeCsrKSB7Ci0gICAgICAgICAgICBjb21iby5zZWxlY3QoaXhzW2lkeF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdERlc2VsZWN0QWxsKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0RGVzZWxlY3RBbGwoKSB7Ci0gICAgICAgIGNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0gICAgICAgIGNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXIjbGlzdFNob3dTZWxlY3Rpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RTaG93U2VsZWN0aW9uKCkgewotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9TY3JvbGxlZFBhZ2VDb250ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Njcm9sbGVkUGFnZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2ZDI1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL1Njcm9sbGVkUGFnZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAgICAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNoYXJlZFNjcm9sbGVkQ29tcG9zaXRlOwotCi0vL2NvcGllZCBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotcHVibGljIGNsYXNzIFNjcm9sbGVkUGFnZUNvbnRlbnQgZXh0ZW5kcyBTaGFyZWRTY3JvbGxlZENvbXBvc2l0ZSB7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IGZUb29sa2l0OwotCQotCXB1YmxpYyBTY3JvbGxlZFBhZ2VDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JfQotCQotCXB1YmxpYyBTY3JvbGxlZFBhZ2VDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJCi0JCXNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCQotCQlGb3JtQ29sb3JzIGNvbG9ycz0gbmV3IEZvcm1Db2xvcnMocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCWNvbG9ycy5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQljb2xvcnMuc2V0Rm9yZWdyb3VuZChudWxsKTsKLQkJCi0JCWZUb29sa2l0PSBuZXcgRm9ybVRvb2xraXQoY29sb3JzKTsKLQkJCi0JCXNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCXNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkKLQkJQ29tcG9zaXRlIGJvZHk9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlib2R5LnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCXNldENvbnRlbnQoYm9keSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmVG9vbGtpdC5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRhcHRDaGlsZChDb250cm9sIGNoaWxkQ29udHJvbCkgewotCQlmVG9vbGtpdC5hZGFwdChjaGlsZENvbnRyb2wsIHRydWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQ29tcG9zaXRlIGdldEJvZHkoKSB7Ci0JCXJldHVybiAoQ29tcG9zaXRlKSBnZXRDb250ZW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0RhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3YjBkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0RhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5KcHREYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudWkuaW50ZXJuYWwuRFRQVWlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQlwcml2YXRlIElKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0JcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGRhdGFiYXNlR3JvdXA7Ci0KLQlwdWJsaWMgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlKCBJSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKCAiRGF0YWJhc2UgU2V0dGluZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQlzZXRUaXRsZSggSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfZGF0YWJhc2VDb25uZWN0aW9uKTsKLQkJc2V0TWVzc2FnZSggSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0VG9EYXRhYmFzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSggZmFsc2UpOwotCQlDb21wb3NpdGUgdG9wID0gdGhpcy5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZSggcGFyZW50KTsKLQkJdGhpcy5zZXRDb250cm9sKCB0b3ApOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoIGxheW91dCk7Ci0JCXRoaXMuZGF0YWJhc2VHcm91cCA9IG5ldyBEYXRhYmFzZUdyb3VwKCBjb21wb3NpdGUpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KCBwYXJlbnQpOwotCQkvLyBUT0RPIEFkZCBIZWxwIC0gdGVzdGluZwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKCBDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCB0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDMwOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoIGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oIENvbXBvc2l0ZSBjb250YWluZXIsIGJvb2xlYW4gZmlsbEhvcml6b250YWwpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oIGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlpZiAoIGZpbGxIb3Jpem9udGFsKSB7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tYm8uc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCkpOwotCQl9Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGEgZ3JpZCBsYXlvdXQgd2l0aCB0aGUgZGVmYXVsdCBEaWFsb2cgc2V0dGluZ3MuCi0JICovCi0JcHJvdGVjdGVkIEdyaWRMYXlvdXQgaW5pdEdyaWRMYXlvdXQoIEdyaWRMYXlvdXQgbGF5b3V0LCBib29sZWFuIG1hcmdpbnMpIHsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gdGhpcy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyggSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gdGhpcy5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoIElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWlmICggbWFyZ2lucykgewotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gdGhpcy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyggSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gdGhpcy5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoIElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJfQotCQllbHNlIHsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJfQotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPFRhYmxlPiBnZXRUYWJsZXMoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKCBzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbiggc2NoZW1hLnRhYmxlcygpKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuPFRhYmxlPmVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHZW5lcmF0ZUVudGl0aWVzUGFnZSggU2NoZW1hIHNjaGVtYSkgewotCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkIGdlbmVyYXRlRW50aXRpZXNXaXphcmQgPSAoKCBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKSB0aGlzLmdldFdpemFyZCgpKTsKLQkJZ2VuZXJhdGVFbnRpdGllc1dpemFyZC51cGRhdGVQb3NzaWJsZVRhYmxlcyggQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oIHNjaGVtYS50YWJsZXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlpZiAoIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWlmICggdGhpcy5jb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbm5lY3Rpb24ucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCQl9Ci0JCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCVN0cmluZyBwcm9maWxlTmFtZSA9IHRoaXMuanBhUHJvamVjdC5nZXREYXRhU291cmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCk7Ci0JCXJldHVybiBKcHREYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkucHJvZmlsZU5hbWVkKCBwcm9maWxlTmFtZSk7Ci0JfQotCi0JU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJcmV0dXJuIHByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggcHJvZmlsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBEYXRhYmFzZUdyb3VwIHsKLQkJcHJpdmF0ZSBmaW5hbCBHcm91cCBncm91cDsKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBjb25uZWN0aW9uTGFiZWw7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gY29ubmVjdGlvbkNvbWJvOwotCQlwcml2YXRlIGZpbmFsIExhYmVsIHNjaGVtYUxhYmVsOwotCQlwcml2YXRlIGZpbmFsIENvbWJvIHNjaGVtYUNvbWJvOwotCQlwcml2YXRlIGZpbmFsIExhYmVsIHNjaGVtYUluZm9MYWJlbDsKLQkJCi0JCXByaXZhdGUgTGluayBhZGRDb25uZWN0aW9uTGluazsKLQkJcHJpdmF0ZSBMaW5rIHJlY29ubmVjdExpbms7Ci0KLQkJcHVibGljIERhdGFiYXNlR3JvdXAoIENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCXRoaXMuZ3JvdXAgPSBuZXcgR3JvdXAoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJdGhpcy5ncm91cC5zZXRMYXlvdXQoIGxheW91dCk7Ci0JCQl0aGlzLmdyb3VwLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl0aGlzLmdyb3VwLnNldFRleHQoIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlKTsKLQkJCS8vVE9ETyBBZGQgSGVscAotLy8JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0aGlzLmdyb3VwLCBJRGFsaUhlbHBDb250ZXh0SWRzLlhYWCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25MYWJlbCA9IGNyZWF0ZUxhYmVsKCB0aGlzLmdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9jb25uZWN0aW9uKTsKLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvID0gY3JlYXRlQ29tYm8oIHRoaXMuZ3JvdXAsIHRydWUpOwotCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl3aWRnZXRTZWxlY3RlZCggZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlQ29ubmVjdGlvbkNoYW5nZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJdGhpcy5zY2hlbWFMYWJlbCA9IGNyZWF0ZUxhYmVsKCB0aGlzLmdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9zY2hlbWEpOwotCQkJdGhpcy5zY2hlbWFDb21ibyA9IGNyZWF0ZUNvbWJvKCB0aGlzLmdyb3VwLCB0cnVlKTsKLQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl3aWRnZXRTZWxlY3RlZCggZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaGFuZGxlU2NoZW1hQ2hhbmdlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlzY2hlbWFJbmZvTGFiZWwgPSBjcmVhdGVMYWJlbCggdGhpcy5ncm91cCwgMiwgSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hSW5mbyk7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaW5rID0gbmV3IExpbmsoIHRoaXMuZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaW5rLnNldExheW91dERhdGEoIGRhdGEpOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGluay5zZXRUZXh0KCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9hZGRDb25uZWN0aW9uTGluayk7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpOwotCQkJCX0KLQkJCX0pOwotCQkJdGhpcy5yZWNvbm5lY3RMaW5rID0gbmV3IExpbmsoIHRoaXMuZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQl0aGlzLnJlY29ubmVjdExpbmsuc2V0TGF5b3V0RGF0YSggZGF0YSk7Ci0JCQl0aGlzLnJlY29ubmVjdExpbmsuc2V0VGV4dCggSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfcmVjb25uZWN0TGluayk7Ci0JCQl0aGlzLnJlY29ubmVjdExpbmsuc2V0RW5hYmxlZCggZmFsc2UpOwotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlvcGVuQ29ubmVjdGlvblByb2ZpbGVOYW1lZCggY29ubmVjdGlvbkNvbWJvLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0aGlzLnBvcHVsYXRlQ29ubmVjdGlvbkNvbWJvKCk7Ci0JCQl0aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJfQotCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lZCggU3RyaW5nIHByb2ZpbGVOYW1lKSB7Ci0JCQlyZXR1cm4gSnB0RGJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSgpLnByb2ZpbGVOYW1lZCggcHJvZmlsZU5hbWUpOwotCQl9Ci0JCQotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gZHRwQ29ubmVjdGlvblByb2ZpbGVOYW1lcygpIHsKLQkJCXJldHVybiBKcHREYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkucHJvZmlsZU5hbWVzKCk7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkgewotCQkJcmV0dXJuIGpwYVByb2plY3QuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQl9Ci0KLQkJU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQlyZXR1cm4gcHJvZmlsZS5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVkKCBwcm9maWxlLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgb3BlbkNvbm5lY3Rpb25Qcm9maWxlTmFtZWQoIFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWUpIHsKLQkJCWlmKCBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCX0KLQkJCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBKcHREYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkucHJvZmlsZU5hbWVkKCBjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCQkJcHJvZmlsZS5jb25uZWN0KCk7Ci0JCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uID0gcHJvZmlsZS5nZXRDb25uZWN0aW9uKCk7Ci0JCQlpZiggRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLnRoaXMuY29ubmVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wb3B1bGF0ZVNjaGVtYUNvbWJvKCk7Ci0JCQkJRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLnRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLmNvbm5lY3Rpb24uYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb25uZWN0aW9uQ29tYm8oKSB7Ci0JCQkvLyBjbGVhciBvdXQgY29ubmVjdGlvbiBlbnRyaWVzIGZyb20gcHJldmlvdXMgbG9naW4uCi0JCQl0aGlzLmNvbm5lY3Rpb25Db21iby5yZW1vdmVBbGwoKTsKLQkJCWZvciAoIEl0ZXJhdG9yPFN0cmluZz4gaSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KCB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSk7IGkuaGFzTmV4dCgpOykgewotCQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvLmFkZCggKCBTdHJpbmcpIGkubmV4dCgpKTsKLQkJCX0KLQotCQkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQkJaWYgKCAhU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSggY29ubmVjdGlvbk5hbWUpKSB7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8uc2VsZWN0KCBjb25uZWN0aW9uQ29tYm8uaW5kZXhPZiggY29ubmVjdGlvbk5hbWUpKTsKLQkJCQl0aGlzLnJlY29ubmVjdExpbmsuc2V0RW5hYmxlZCggdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaGFuZGxlQ29ubmVjdGlvbkNoYW5nZSgpIHsKLQkJCXRoaXMucmVjb25uZWN0TGluay5zZXRFbmFibGVkKCB0cnVlKTsKLQkJCXRoaXMucG9wdWxhdGVTY2hlbWFDb21ibygpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZVNjaGVtYUNoYW5nZSgpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVkKCBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSk7Ci0JCQlTY2hlbWEgc2NoZW1hID0gIGNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQoIHRoaXMuZ2V0U2NoZW1hTmFtZSgpKTsKLQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLnVwZGF0ZUdlbmVyYXRlRW50aXRpZXNQYWdlKCBzY2hlbWEpOwotCQkJRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLnRoaXMuc2V0UGFnZUNvbXBsZXRlKCB0cnVlKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVNjaGVtYUNvbWJvKCkgewotCQkJLy8gY2xlYXIgb3V0IHNjaGVtYSBlbnRyaWVzIGZyb20gcHJldmlvdXMgY29ubmVjdGlvbiBzZWxlY3Rpb24KLQkJCXRoaXMuc2NoZW1hQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lZCggZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkpOwotCQkJZm9yICggSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCggY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lcygpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvLmFkZCggKCBTdHJpbmcpIHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQkJLy8gc2V0IGxvZ2luIHVzZXIgbmFtZSBhcyBkZWZhdWx0IHNjaGVtYQotCQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJaWYgKCBzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlzY2hlbWEgPSAgY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggc2NoZW1hLmdldE5hbWUoKSk7IC8vIHZlcmlmeSBzY2hlbWEgZXhpc3QKLQkJCQlpZiAoIHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KCB0aGlzLnNjaGVtYUNvbWJvLmluZGV4T2YoIHNjaGVtYS5nZXROYW1lKCkpKTsKLQkJCQkJdXBkYXRlR2VuZXJhdGVFbnRpdGllc1BhZ2UoIHNjaGVtYSk7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZSggdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbkNvbWJvLmdldFRleHQoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGdldFNjaGVtYU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zY2hlbWFDb21iby5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKSB7Ci0JCQlTdHJpbmcgYWRkZWRQcm9maWxlTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3UHJvZmlsZSgpOwotCQkJICAKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZSA9IENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeS5pbnN0YW5jZSgpLnByb2ZpbGVOYW1lZCggYWRkZWRQcm9maWxlTmFtZSk7Ci0JCQotCQkJaWYoICFhZGRlZFByb2ZpbGUuaXNOdWxsKCkpIHsKLQkJCQl0aGlzLnBvcHVsYXRlQ29ubmVjdGlvbkNvbWJvKCk7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8uc2VsZWN0KCBjb25uZWN0aW9uQ29tYm8uaW5kZXhPZiggYWRkZWRQcm9maWxlLmdldE5hbWUoKSkpOwotCQkJCXRoaXMuaGFuZGxlQ29ubmVjdGlvbkNoYW5nZSgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZSggQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgb3BlbmVkKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkJaWYoIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLmNvbm5lY3Rpb24uZXF1YWxzKCBjb25uZWN0aW9uKSkgewotCQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZSggQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJCWlmKCBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uLmVxdWFscyggY29ubmVjdGlvbikpIHsKLQkJCQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2xvc2VkKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0dlbmVyYXRlRW50aXRpZXNXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJhMTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkVudGl0eUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZCBleHRlbmRzIFdpemFyZCB7CQotCi0JcHJpdmF0ZSBJSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKiogdGhpcyBwYWdlIGlzIG9ubHkgYnVpbHQgd2hlbiB0aGUgcHJvamVjdCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBkYiAqLwotCXByaXZhdGUgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlIGRiU2V0dGluZ3NQYWdlOwotCi0JcHJpdmF0ZSBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZSBnZW5lcmF0ZUVudGl0aWVzUGFnZTsKLQotCXByaXZhdGUgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUdlbmVyYXRvckNvbmZpZzsKLQotCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlHZW5lcmF0b3JDb25maWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248VGFibGU+IHNlbGVjdGVkVGFibGVzOwotCi0JcHVibGljIEdlbmVyYXRlRW50aXRpZXNXaXphcmQoIElKcGFQcm9qZWN0IGpwYVByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnID0gbmV3IFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnKCk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnID0gbmV3IEVudGl0eUdlbmVyYXRvci5Db25maWcoKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJdGhpcy5kYlNldHRpbmdzUGFnZSA9IG5ldyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UoIHRoaXMuanBhUHJvamVjdCk7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLmRiU2V0dGluZ3NQYWdlKTsKLQkJdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZSA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZSgpOwotCQl0aGlzLmFkZFBhZ2UoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UpOwotCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmluaXQoIHRoaXMuc2VsZWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnLnNldFBhY2thZ2VGcmFnbWVudCggdGhpcy5idWlsZFBhY2thZ2VGcmFnbWVudCgpKTsKLQotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRDb252ZXJ0VG9DYW1lbENhc2UoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuY29udmVydFRvQ2FtZWxDYXNlKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRGaWVsZEFjY2Vzc1R5cGUoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZmllbGRBY2Nlc3NUeXBlKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRDb2xsZWN0aW9uVHlwZU5hbWUoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRGaWVsZFZpc2liaWxpdHkoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0RmllbGRWaXNpYmlsaXR5KCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRNZXRob2RWaXNpYmlsaXR5KCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldE1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldFNlcmlhbGl6YWJsZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5zZXJpYWxpemFibGUoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0T3ZlcnJpZGVFbnRpdHlOYW1lcyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRPdmVycmlkZUVudGl0eU5hbWVzKCkpOwotCi0JCXRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2Uuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCgpOwotCQkKLQkJdGhpcy5zZWxlY3RlZFRhYmxlcyA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0U2VsZWN0ZWRUYWJsZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBidWlsZFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0JCQotCQlpZiAoIHBhY2thZ2VGcmFnbWVudCA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlRnJhZ21lbnQ9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJaWYgKCBwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnQ7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdHJ1ZSwgbnVsbCk7Ci0JCX0gCi0JCWNhdGNoICggSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZXgpOwotCQl9Ci0JfQotCQotCUNvbGxlY3Rpb248VGFibGU+IGdldFBvc3NpYmxlVGFibGVzKCkgewotCQlpZiAoIHRoaXMuZGJTZXR0aW5nc1BhZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZGJTZXR0aW5nc1BhZ2UuZ2V0VGFibGVzKCk7Ci0JCX0KLQkJcmV0dXJuICggdGhpcy5wcm9qZWN0RGVmYXVsdFNjaGVtYUV4aXN0cygpKSA/IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKCB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS50YWJsZXMoKSkgOiBDb2xsZWN0aW9ucy48VGFibGU+ZW1wdHlMaXN0KCk7Ci0JfQotCQotCUNvbm5lY3Rpb25Qcm9maWxlIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5jb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQkKLQlJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCl7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JfQotCi0JU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJcmV0dXJuIHByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggcHJvZmlsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgUGFja2FnZUdlbmVyYXRvci5Db25maWcgZ2V0UGFja2FnZUdlbmVyYXRvckNvbmZpZygpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZUdlbmVyYXRvckNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBnZXRFbnRpdHlHZW5lcmF0b3JDb25maWcoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxUYWJsZT4gZ2V0U2VsZWN0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkVGFibGVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCl7Ci0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWw7Ci0JfQotCQotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLSAgICAgICAgYm9vbGVhbiBjYW5GaW5pc2ggPSB0cnVlOwotICAgICAgICBpZiAoICEgdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0gICAgICAgIAljYW5GaW5pc2ggPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuRmluaXNoOwotICAgIH0KLSAgICAKLQlwcml2YXRlIGJvb2xlYW4ganBhUHJvamVjdElzQ29ubmVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0RGVmYXVsdFNjaGVtYUV4aXN0cygpIHsKLQkJcmV0dXJuICggdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkgIT0gbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIHVwZGF0ZVBvc3NpYmxlVGFibGVzIGlzIGNhbGxlZCB3aGVuIHNjaGVtYZJzIFBvc3NpYmxlVGFibGVzIGNoYW5nZWQuCi0JICogVGhlIGRiU2V0dGluZ3NQYWdlIGlzIG1haW5seSB0aGUgc291cmNlIG9mIGNoYW5nZXMsIAotCSAqIGFuZCB0aGUgZ2VuZXJhdGVFbnRpdGllc1BhZ2UgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jLgotCSAqLwotCXZvaWQgdXBkYXRlUG9zc2libGVUYWJsZXMoIENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7Ci0JCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UudXBkYXRlVGFibGVzTGlzdFZpZXdlciggcG9zc2libGVUYWJsZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTAwZDVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8vIFRPRE8gZGV0ZXJtaW5lIG5hbWUgY29sbGlzaW9ucwotY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7Ci0KLQlDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVGFibGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZmllbGRBY2Nlc3NUeXBlID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uVHlwZU5hbWUgPSBTZXQuY2xhc3MuZ2V0TmFtZSgpOwotCXByaXZhdGUgaW50IGZpZWxkVmlzaWJpbGl0eSA9IEVudGl0eUdlbmVyYXRvci5Db25maWcuUFJJVkFURTsKLQlwcml2YXRlIGludCBtZXRob2RWaXNpYmlsaXR5ID0gRW50aXR5R2VuZXJhdG9yLkNvbmZpZy5QVUJMSUM7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHNlcmlhbGl6YWJsZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sID0gZmFsc2U7Ci0JcHJpdmF0ZSBNYXA8VGFibGUsIFN0cmluZz4gb3ZlcnJpZGVFbnRpdHlOYW1lczsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gVEFCTEVfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMgPSB7ICJ0YWJsZSIsICJlbnRpdHlOYW1lIiB9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJMRV9DT0xVTU5fSU5ERVggPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVggPSAxOwotCQotCi0JR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKHRydWUsICJHZW5lcmF0ZSBFbnRpdGllcyIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZ2VuZXJhdGVFbnRpdGllcyk7Ci0JCXNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9jaG9vc2VFbnRpdHlUYWJsZSk7Ci0JfQotCQotCS8vIC0tLS0tLS0tIEluaXRpYWxpemF0aW9uIC0tLS0tLS0tLQotCS8qKgotCSAqIFRoZSB3aXphcmQgb3duaW5nIHRoaXMgcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHRoZQotCSAqIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgc2VsZWN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSB3aXphcmQgCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzCi0JICovCi0Jdm9pZCBpbml0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnQgamVsZW09IGdldEluaXRpYWxKYXZhRWxlbWVudChzZWxlY3Rpb24pOwotCQlpbml0Q29udGFpbmVyUGFnZShqZWxlbSk7Ci0JCWluaXRUeXBlUGFnZShqZWxlbSk7Ci0JCWRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlpbnQgbkNvbHVtbnM9IDQ7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19HRU5FUkFURV9FTlRJVElFUyk7Ci0JCQotCQljcmVhdGVDb250YWluZXJDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsJCi0JCWNyZWF0ZVBhY2thZ2VDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsJCi0JCQotCQlmaW5hbCBCdXR0b24gc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3N5bmNocm9uaXplQ2xhc3Nlcyk7Ci0JCXN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRTeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKHN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlHcm91cCB0YWJsZXNHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLQkJdGFibGVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXRhYmxlc0dyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZXMpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGFibGVzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNyZWF0ZVRhYmxlc1NlbGVjdGlvbkNvbnRyb2wodGFibGVzR3JvdXApOwotCQljcmVhdGVCdXR0b25Db21wb3NpdGUodGFibGVzR3JvdXApOwotCQkKLQkJR2VuZXJhdGVFbnRpdGllc1dpemFyZCBnZW5lcmF0ZUVudGl0aWVzV2l6YXJkID0gKChHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpOwotCQlDb2xsZWN0aW9uPFRhYmxlPiBwb3NzaWJsZVRhYmxlcyA9IGdlbmVyYXRlRW50aXRpZXNXaXphcmQuZ2V0UG9zc2libGVUYWJsZXMoKTsKLQkJaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2wocG9zc2libGVUYWJsZXMpOwotCQkKLQkJLy9zZXQgaW5pdGlhbCBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIHN5bmNocm9uaXplIGNsYXNzZXMgY2hlY2tib3gKLQkJc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCFnZW5lcmF0ZUVudGl0aWVzV2l6YXJkLmdldEpwYVByb2plY3QoKS5pc0Rpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpKTsKLQkJc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMudGFibGVUYWJsZS5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfVEFCTEVTKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0QWxsVGFibGVzKCl7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQlkb1N0YXR1c1VwZGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVzZWxlY3RBbGxUYWJsZXMoKXsKLQkJdGhpcy50YWJsZVRhYmxlLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQlkb1N0YXR1c1VwZGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2woQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKLQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzID0gbmV3IEhhc2hNYXA8VGFibGUsIFN0cmluZz4ocG9zc2libGVUYWJsZXMuc2l6ZSgpKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldElucHV0KHBvc3NpYmxlVGFibGVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVzU2VsZWN0aW9uQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRhYmxlTGF5b3V0Q29tcG9zaXRlIGxheW91dD0gbmV3IFRhYmxlTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlhZGRDb2x1bW5MYXlvdXREYXRhKGxheW91dCk7Ci0JCQotCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZSB0YWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZShsYXlvdXQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkKLQkJVGFibGVDb2x1bW4gdGFibGVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgVEFCTEVfQ09MVU1OX0lOREVYKTsKLQkJdGFibGVOYW1lQ29sdW1uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZUNvbHVtbik7Ci0JCXRhYmxlTmFtZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gZW50aXR5TmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWCk7Ci0JCWVudGl0eU5hbWVDb2x1bW4uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2VudGl0eU5hbWVDb2x1bW4pOwotCQllbnRpdHlOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCi0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludD0gU1dUVXRpbC5nZXRUYWJsZUhlaWdodEhpbnQodGFibGUsIDIwKTsKLQkJZ2Qud2lkdGhIaW50ID0gNjAwOwotCQlsYXlvdXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdGhpcy50YWJsZVRhYmxlID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIodGFibGUpOwotCQl0aGlzLnRhYmxlVGFibGUuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldExhYmVsUHJvdmlkZXIodGhpcy5idWlsZFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQl0aGlzLnRhYmxlVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQl0aGlzLnRhYmxlVGFibGUuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlyZXR1cm4gKChUYWJsZSkgZTEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChUYWJsZSkgZTIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy50YWJsZVRhYmxlLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkYyICYmIGUuc3RhdGVNYXNrID09IFNXVC5OT05FKSB7Ci0JCQkJCWVkaXRFbnRpdHlOYW1lSWZQb3NzaWJsZSgpOwotCQkJCQllLmRvaXQ9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLmFkZENlbGxFZGl0b3JzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25Db21wb3NpdGUoR3JvdXAgdGFibGVzR3JvdXApewotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFibGVzR3JvdXAsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBidXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlCdXR0b24gc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmFsX3NlbGVjdEFsbCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbFRhYmxlcygpOwotCQkJCQotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmFsX2Rlc2VsZWN0QWxsKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRlc2VsZWN0QWxsVGFibGVzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uTGF5b3V0RGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQl9Ci0KLQl2b2lkIGVkaXRFbnRpdHlOYW1lSWZQb3NzaWJsZSgpewotCQlPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMudGFibGVUYWJsZS5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQlpZiAoc2VsZWN0ZWQubGVuZ3RoICE9IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlVGFibGUuZWRpdEVsZW1lbnQoc2VsZWN0ZWRbMF0sIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDZWxsRWRpdG9ycygpIHsKLQkJdGhpcy50YWJsZVRhYmxlLnNldENvbHVtblByb3BlcnRpZXMoVEFCTEVfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMpOwotCQkKLQkJVGV4dENlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IFRleHRDZWxsRWRpdG9yW1RBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTLmxlbmd0aF07Ci0JCWVkaXRvcnNbRU5USVRZX05BTUVfQ09MVU1OX0lOREVYXT0gbmV3IFRleHRDZWxsRWRpdG9yKHRoaXMudGFibGVUYWJsZS5nZXRUYWJsZSgpLCBTV1QuU0lOR0xFKTsKLQkJCi0JCXRoaXMudGFibGVUYWJsZS5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldENlbGxNb2RpZmllcih0aGlzLmJ1aWxkVGFibGVUYWJsZUNlbGxNb2RpZmllcigpKTsKLQl9Ci0KLQl2b2lkIGhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJaWYgKCAhIHRoaXMuaGFzVGFibGVzU2VsZWN0ZWQoKSkgewotCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JfQotCQotCXByaXZhdGUgSUNlbGxNb2RpZmllciBidWlsZFRhYmxlVGFibGVDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUNlbGxNb2RpZmllcigpOwotCX0KLQkKLQlDb2xsZWN0aW9uPFRhYmxlPiBnZXRTZWxlY3RlZFRhYmxlcygpIHsKLQkJQXJyYXlMaXN0PFRhYmxlPiBzZWxlY3RlZFRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VGFibGU+KCk7Ci0JCWZvciAoT2JqZWN0IHNlbGVjdGVkVGFibGUgOiB0aGlzLnRhYmxlVGFibGUuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpCi0JCQlzZWxlY3RlZFRhYmxlcy5hZGQoKFRhYmxlKSBzZWxlY3RlZFRhYmxlKTsKLQkJcmV0dXJuIHNlbGVjdGVkVGFibGVzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzVGFibGVzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAodGhpcy50YWJsZVRhYmxlICE9IG51bGwpID8gKHRoaXMuZ2V0U2VsZWN0ZWRUYWJsZXMoKS5zaXplKCkgPiAwKSA6IGZhbHNlOwotCX0KLQkKLQl2b2lkIHVwZGF0ZVRhYmxlc0xpc3RWaWV3ZXIoQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKLQkJaWYgKHRoaXMudGFibGVUYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmluaXRUYWJsZXNTZWxlY3Rpb25Db250cm9sKHBvc3NpYmxlVGFibGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb1N0YXR1c1VwZGF0ZSgpIHsKLQkJLy8gc3RhdHVzIG9mIGFsbCB1c2VkIGNvbXBvbmVudHMKLQkJSVN0YXR1c1tdIHN0YXR1cz0gbmV3IElTdGF0dXNbXSB7Ci0JCQlmQ29udGFpbmVyU3RhdHVzLAotCQkJZlBhY2thZ2VTdGF0dXMKLQkJfTsKLQkJLy8gdGhlIG1vZGUgc2V2ZXJlIHN0YXR1cyB3aWxsIGJlIGRpc3BsYXllZCBhbmQgdGhlIE9LIGJ1dHRvbiBlbmFibGVkL2Rpc2FibGVkLgotCQl0aGlzLnVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIHN0YXR1cyBsaW5lIGFuZCB0aGUgT0sgYnV0dG9uIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXN1cGVyLnVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCQlpZiAodGhpcy5pc1BhZ2VDb21wbGV0ZSgpICYmICEgdGhpcy5oYXNUYWJsZXNTZWxlY3RlZCgpKSB7Ci0JCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlTdHJpbmcgZW50aXR5TmFtZShUYWJsZSB0YWJsZSkgewotCQlTdHJpbmcgb3ZlcnJpZGVFbnRpdHlOYW1lID0gKFN0cmluZykgdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLmdldCh0YWJsZSk7Ci0JCXJldHVybiAob3ZlcnJpZGVFbnRpdHlOYW1lICE9IG51bGwpID8gb3ZlcnJpZGVFbnRpdHlOYW1lIDogdGhpcy5kZWZhdWx0RW50aXR5TmFtZSh0YWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEVudGl0eU5hbWUoVGFibGUgdGFibGUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0YWJsZS5zaG9ydEphdmFDbGFzc05hbWUoKTsKLQkJaWYgKHRoaXMuY29udmVydFRvQ2FtZWxDYXNlKSB7Ci0JCQllbnRpdHlOYW1lID0gU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZW50aXR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVudGl0eU5hbWU7Ci0JfQotCi0Jdm9pZCBzZXRPdmVycmlkZUVudGl0eU5hbWUoVGFibGUgdGFibGUsIFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0YWJsZS5zaG9ydEphdmFDbGFzc05hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCXRoaXMub3ZlcnJpZGVFbnRpdHlOYW1lcy5yZW1vdmUodGFibGUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLnB1dCh0YWJsZSwgbmFtZSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGNvbnZlcnRUb0NhbWVsQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvQ2FtZWxDYXNlOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0Q29udmVydFRvQ2FtZWxDYXNlKGJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlKSB7Ci0JCS8vIFRPRE8gcmUtY2FsY3VsYXRlIHRoZSBkZWZhdWx0IGVudGl0eSBuYW1lcyBpZiB0aGlzIGNoYW5nZXMKLQkJdGhpcy5jb252ZXJ0VG9DYW1lbENhc2UgPSBjb252ZXJ0VG9DYW1lbENhc2U7Ci0JfQotCi0JYm9vbGVhbiBmaWVsZEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkQWNjZXNzVHlwZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldEZpZWxkQWNjZXNzVHlwZShib29sZWFuIGZpZWxkQWNjZXNzVHlwZSkgewotCQl0aGlzLmZpZWxkQWNjZXNzVHlwZSA9IGZpZWxkQWNjZXNzVHlwZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uVHlwZU5hbWU7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRDb2xsZWN0aW9uVHlwZU5hbWUoU3RyaW5nIGNvbGxlY3Rpb25UeXBlTmFtZSkgewotCQl0aGlzLmNvbGxlY3Rpb25UeXBlTmFtZSA9IGNvbGxlY3Rpb25UeXBlTmFtZTsKLQl9Ci0KLQlpbnQgZ2V0RmllbGRWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gdGhpcy5maWVsZFZpc2liaWxpdHk7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRGaWVsZFZpc2liaWxpdHkoaW50IGZpZWxkVmlzaWJpbGl0eSkgewotCQl0aGlzLmZpZWxkVmlzaWJpbGl0eSA9IGZpZWxkVmlzaWJpbGl0eTsKLQl9Ci0KLQlpbnQgZ2V0TWV0aG9kVmlzaWJpbGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMubWV0aG9kVmlzaWJpbGl0eTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZFZpc2liaWxpdHkoaW50IG1ldGhvZFZpc2liaWxpdHkpIHsKLQkJdGhpcy5tZXRob2RWaXNpYmlsaXR5ID0gbWV0aG9kVmlzaWJpbGl0eTsKLQl9Ci0KLQlib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnM7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRHZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycykgewotCQl0aGlzLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMgPSBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzOwotCX0KLQotCWJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcikgewotCQl0aGlzLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yID0gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3I7Ci0JfQotCi0JYm9vbGVhbiBzZXJpYWxpemFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlcmlhbGl6YWJsZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldFNlcmlhbGl6YWJsZShib29sZWFuIHNlcmlhbGl6YWJsZSkgewotCQl0aGlzLnNlcmlhbGl6YWJsZSA9IHNlcmlhbGl6YWJsZTsKLQl9Ci0KLQlib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKSB7Ci0JCXRoaXMuZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEID0gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEOwotCX0KLQotCWJvb2xlYW4gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldEdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKSB7Ci0JCXRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyA9IGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEs7Ci0JfQotCi0JYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwpewotCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwotCX0KLQkKLQkvKioKLQkgKiBrZXkgPSB0YWJsZQotCSAqIHZhbHVlID0gb3ZlcnJpZGUgZW50aXR5IG5hbWUKLQkgKi8KLQlNYXA8VGFibGUsIFN0cmluZz4gZ2V0T3ZlcnJpZGVFbnRpdHlOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGVFbnRpdHlOYW1lczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCVRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVGFibGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBUQUJMRV9DT0xVTU5fSU5ERVg6Ci0JCQkJCXJldHVybiAoKFRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJCQljYXNlIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWDoKLQkJCQkJcmV0dXJuIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMuZW50aXR5TmFtZSgoVGFibGUpIGVsZW1lbnQpOwotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjb2x1bW4gaW5kZXg6ICIgKyBjb2x1bW5JbmRleCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCVRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZVRhYmxlQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0KLQkJVGFibGVUYWJsZUNlbGxNb2RpZmllcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIHByb3BlcnR5LmVxdWFscyhUQUJMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVhdKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYgKHByb3BlcnR5LmVxdWFscyhUQUJMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVhdKSkgewotCQkJCXJldHVybiBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLmVudGl0eU5hbWUoKFRhYmxlKSBlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQllbGVtZW50PSAoKFRhYmxlSXRlbSkgZWxlbWVudCkuZ2V0RGF0YSgpOwotCQkJfQotCQkJaWYgKCAhIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlib29sZWFuIHVuY2hhbmdlZCA9IGZhbHNlOwotCQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGVsZW1lbnQ7Ci0JCQlpZiAocHJvcGVydHkuZXF1YWxzKFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0VOVElUWV9OQU1FX0NPTFVNTl9JTkRFWF0pKSB7Ci0JCQkJdW5jaGFuZ2VkID0gR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UudGhpcy5lbnRpdHlOYW1lKHRhYmxlKS5lcXVhbHModmFsdWUpOwotCQkJCUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMuc2V0T3ZlcnJpZGVFbnRpdHlOYW1lKHRhYmxlLCAoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCQlpZiAoISB1bmNoYW5nZWQpIHsKLQkJCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLnRhYmxlVGFibGUudXBkYXRlKHRhYmxlLCBuZXcgU3RyaW5nW10geyBwcm9wZXJ0eSB9KTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0V2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlMTkzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlVzZXJMaWJyYXJ5UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFQbGF0Zm9ybVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LklKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudWkuaW50ZXJuYWwuRFRQVWlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkFic3RyYWN0RGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5DaGFuZ2VUYXJnZXRlZFJ1bnRpbWVzRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldHNTZWxlY3Rpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlOwotCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRXaXphcmRQYWdlIAotCWV4dGVuZHMgRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZQotCWltcGxlbWVudHMgSUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCXByaXZhdGUgUGxhdGZvcm1Hcm91cCBwbGF0Zm9ybUdyb3VwOwotCQotCXByaXZhdGUgQ29ubmVjdGlvbkdyb3VwIGNvbm5lY3Rpb25Hcm91cDsKLQkKLQlwcml2YXRlIENsYXNzcGF0aENvbmZpZ0dyb3VwIGNsYXNzcGF0aENvbmZpZ0dyb3VwOwotCQotCXByaXZhdGUgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwIHBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cDsKLQkKLQlwcml2YXRlIE9ybVhtbEdyb3VwIG9ybVhtbEdyb3VwOwotCQotCQotCXB1YmxpYyBKcGFGYWNldFdpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJqcHQuanBhLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuSlBBX1dJWl9CQU5ORVIpKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCXBsYXRmb3JtR3JvdXAgPSBuZXcgUGxhdGZvcm1Hcm91cChjb21wb3NpdGUpOwotCQljb25uZWN0aW9uR3JvdXAgPSBuZXcgQ29ubmVjdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNsYXNzcGF0aENvbmZpZ0dyb3VwID0gbmV3IENsYXNzcGF0aENvbmZpZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCXBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cCA9IG5ldyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoY29tcG9zaXRlKTsKLQkJb3JtWG1sR3JvdXAgPSBuZXcgT3JtWG1sR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCXNldFVwUnVudGltZUxpc3RlbmVyKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0pQQV9GQUNFVCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VXBSdW50aW1lTGlzdGVuZXIoKSB7Ci0JCWZpbmFsIENoYW5nZVRhcmdldGVkUnVudGltZXNEYXRhTW9kZWwgcnVudGltZURhdGFNb2RlbCA9IGdldFJ1bnRpbWVEYXRhTW9kZWwoKTsKLQkJLy8gbXVzdCBkbyBpdCBtYW51YWxseSB0aGUgZmlyc3QgdGltZQotCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCBydW50aW1lRGF0YU1vZGVsLmdldFByaW1hcnlSdW50aW1lKCkpOwotCQlydW50aW1lRGF0YU1vZGVsLmFkZExpc3RlbmVyKAotCQkJQ2hhbmdlVGFyZ2V0ZWRSdW50aW1lc0RhdGFNb2RlbC5FVkVOVF9QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCwKLQkJCW5ldyBBYnN0cmFjdERhdGFNb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoKSB7Ci0JCQkJCW1vZGVsLnNldFByb3BlcnR5KFJVTlRJTUUsIHJ1bnRpbWVEYXRhTW9kZWwuZ2V0UHJpbWFyeVJ1bnRpbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZVRhcmdldGVkUnVudGltZXNEYXRhTW9kZWwgZ2V0UnVudGltZURhdGFNb2RlbCgpIHsKLQkJLy8gVGhpcyBpcyBoYWNreSwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlIG9ubHkgY3VycmVudCB3YXkgdG8gZG8gdGhpcwotCQkvLyBzZWUgYnVnIDEzODA3NAotCQlGYWNldHNTZWxlY3Rpb25QYWdlIGZhY2V0UGFnZSA9IG51bGw7Ci0JCWZvciAoSVdpemFyZFBhZ2UgcGFnZSA6IGdldFdpemFyZCgpLmdldFBhZ2VzKCkpIHsKLQkJCWlmIChwYWdlIGluc3RhbmNlb2YgRmFjZXRzU2VsZWN0aW9uUGFnZSkgewotCQkJCWZhY2V0UGFnZSA9IChGYWNldHNTZWxlY3Rpb25QYWdlKSBwYWdlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAoZmFjZXRQYWdlID09IG51bGwpID8KLQkJCW51bGwgOgotCQkJZmFjZXRQYWdlLnBhbmVsLmdldERhdGFNb2RlbCgpLmdldFRhcmdldGVkUnVudGltZXNEYXRhTW9kZWwoKTsKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5PTkUgfCBzdHlsZSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQl9Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCVBMQVRGT1JNX0lELAotCQkJQ09OTkVDVElPTiwKLQkJCVVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLAotCQkJSlBBX0xJQlJBUlksCi0JCQlESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUwotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKCEgc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChtb2RlbC52YWxpZGF0ZSgpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ib1ZpZXdlciBwbGF0Zm9ybUNvbWJvOwotCQkKLQkJCi0JCXB1YmxpYyBQbGF0Zm9ybUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSUpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfUExBVEZPUk0pOwotCQkJCi0JCQlwbGF0Zm9ybUNvbWJvID0gbmV3IENvbWJvVmlld2VyKGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKSk7Ci0JCQlwbGF0Zm9ybUNvbWJvLnNldENvbnRlbnRQcm92aWRlcigKLQkJCQkJbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KEpwYVBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuYWxsSnBhUGxhdGZvcm1JZHMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0JCQkJCX0KLQkJCQkpOwotCQkJcGxhdGZvcm1Db21iby5zZXRMYWJlbFByb3ZpZGVyKAotCQkJCQluZXcgSUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SnBhUGxhdGZvcm1MYWJlbCgoU3RyaW5nKSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJcGxhdGZvcm1Db21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShQTEFURk9STV9JRCwgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCS8vIHdlIG5lZWQgc29tZSBpbnB1dCBoZXJlLCBldmVuIGlmIGl0IG1lYW5zIGFic29sdXRlbHkgbm90aGluZwotCQkJcGxhdGZvcm1Db21iby5zZXRJbnB1dCgibnVsbCBpbnB1dCIpOwotCQkJaWYgKHBsYXRmb3JtQ29tYm8uZ2V0RWxlbWVudEF0KDApICE9IG51bGwpIHsKLQkJCQlwbGF0Zm9ybUNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwbGF0Zm9ybUNvbWJvLmdldEVsZW1lbnRBdCgwKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbkdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbm5lY3Rpb25Db21ibzsKLQkJCi0JCXByaXZhdGUgTGluayBjb25uZWN0aW9uTGluazsKLQkJCi0JCQotCQlwdWJsaWMgQ29ubmVjdGlvbkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQkKLQkJCWNvbm5lY3Rpb25Db21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCWNvbm5lY3Rpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCW1vZGVsLnNldFByb3BlcnR5KENPTk5FQ1RJT04sIGNvbm5lY3Rpb25Db21iby5nZXRJdGVtKGNvbm5lY3Rpb25Db21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJZmlsbENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAoY29ubmVjdGlvbkNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCWNvbm5lY3Rpb25Db21iby5zZWxlY3QoMCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbkNvbWJvLmdldEl0ZW0oMCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29ubmVjdGlvbkNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCWNvbm5lY3Rpb25MaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljb25uZWN0aW9uTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rKTsKLQkJCWNvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpOwkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlsbENvbm5lY3Rpb25zKCkgewotCQkJLy9jbGVhciBvdXQgY29ubmVjdGlvbiBlbnRyaWVzIGZyb20gcHJldmlvdXMgbG9naW4uCi0JCQljb25uZWN0aW9uQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCkucHJvZmlsZU5hbWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCWNvbm5lY3Rpb25Db21iby5hZGQoKFN0cmluZykgc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgewotCQkJcmV0dXJuIGNvbm5lY3Rpb25Db21iby5nZXRUZXh0KCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpIHsKLQkJCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3UHJvZmlsZSgpOwotCQkJaWYgKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpIHsKLQkJCQlmaWxsQ29ubmVjdGlvbnMoKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShDT05ORUNUSU9OLCBjb25uZWN0aW9uTmFtZSk7Ci0JCQkJY29ubmVjdGlvbkNvbWJvLnNlbGVjdChjb25uZWN0aW9uQ29tYm8uaW5kZXhPZihjb25uZWN0aW9uTmFtZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgQ2xhc3NwYXRoQ29uZmlnR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHVzZVNlcnZlckxpYkJ1dHRvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHNwZWNpZnlMaWJCdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIENvbWJvIGpwYUxpYkNvbWJvOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBMaW5rIGpwYVByZWZzTGluazsKLQkJCi0JCXByaXZhdGUgZmluYWwgTGluayB1c2VyTGlic0xpbms7Ci0JCQotCQkKLQkJCi0JCXB1YmxpYyBDbGFzc3BhdGhDb25maWdHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSUpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKLQkJCQotCQkJYm9vbGVhbiB1c2VTZXJ2ZXJMaWIgPSBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04pOwotCQkJCi0JCQl1c2VTZXJ2ZXJMaWJCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDIsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJTZXJ2ZXJMaWJMYWJlbCwgU1dULlJBRElPKTsKLQkJCXVzZVNlcnZlckxpYkJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU2VydmVyTGliKTsKLQkJCXVzZVNlcnZlckxpYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTiwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJCi0JCQlzcGVjaWZ5TGliQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9zcGVjaWZ5TGliTGFiZWwsIFNXVC5SQURJTyk7Ci0JCQlzcGVjaWZ5TGliQnV0dG9uLnNldFNlbGVjdGlvbighIHVzZVNlcnZlckxpYik7Ci0JCQlzcGVjaWZ5TGliQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCQluZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJCi0JCQlqcGFMaWJDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oanBhTGliQ29tYm8sIEpQQV9MSUJSQVJZLCBudWxsKTsKLQkJCQotCQkJbW9kZWwuYWRkTGlzdGVuZXIoCi0JCQkJCW5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlpZiAoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQkJCQlib29sZWFuIHVzZVNlcnZlckxpYiA9IChCb29sZWFuKSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJCQkJCQl1c2VTZXJ2ZXJMaWJCdXR0b24uc2V0U2VsZWN0aW9uKHVzZVNlcnZlckxpYik7Ci0JCQkJCQkJCXNwZWNpZnlMaWJCdXR0b24uc2V0U2VsZWN0aW9uKCEgdXNlU2VydmVyTGliKTsKLQkJCQkJCQkJanBhTGliQ29tYm8uc2V0RW5hYmxlZCghIHVzZVNlcnZlckxpYik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQotCQkJanBhUHJlZnNMaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWpwYVByZWZzTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJanBhUHJlZnNMaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfanBhUHJlZnNMaW5rKTsKLQkJCWpwYVByZWZzTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJcHJvbXB0VG9Db25maWdKcGFQcmVmcygpOwkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQkKLQkJCXVzZXJMaWJzTGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQl1c2VyTGlic0xpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXVzZXJMaWJzTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJMaWJzTGluayk7Ci0JCQl1c2VyTGlic0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXByb21wdFRvQ29uZmlnVXNlckxpYnJhcmllcygpOwkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwcm9tcHRUb0NvbmZpZ0pwYVByZWZzKCkgewotCQkJUHJlZmVyZW5jZURpYWxvZyBkbGcgPSAKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKAotCQkJCQlnZXRTaGVsbCgpLCAKLQkJCQkJSnBhUHJlZmVyZW5jZVBhZ2UuSUQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7SnBhUHJlZmVyZW5jZVBhZ2UuSUR9LAotCQkJCQludWxsKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEpQQV9MSUJSQVJZLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHByb21wdFRvQ29uZmlnVXNlckxpYnJhcmllcygpIHsKLQkJCVByZWZlcmVuY2VEaWFsb2cgZGxnID0gCi0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbigKLQkJCQkJZ2V0U2hlbGwoKSwgCi0JCQkJCVVzZXJMaWJyYXJ5UHJlZmVyZW5jZVBhZ2UuSUQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7VXNlckxpYnJhcnlQcmVmZXJlbmNlUGFnZS5JRH0sCi0JCQkJCW51bGwpOwotCQkJZGxnLm9wZW4oKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEpQQV9MSUJSQVJZLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBkaXNjb3ZlckNsYXNzZXNCdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBsaXN0Q2xhc3Nlc0J1dHRvbjsKLQkJCi0JCQotCQlwdWJsaWMgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50TGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwotCQkJCi0JCQlib29sZWFuIGRpc2NvdmVyQ2xhc3NlcyA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyk7Ci0JCQkKLQkJCWRpc2NvdmVyQ2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGlzY292ZXJDbGFzc2VzQnV0dG9uLCBTV1QuUkFESU8pOwotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uLnNldFNlbGVjdGlvbihkaXNjb3ZlckNsYXNzZXMpOwotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQotCQkJbGlzdENsYXNzZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uLCBTV1QuUkFESU8pOwotCQkJbGlzdENsYXNzZXNCdXR0b24uc2V0U2VsZWN0aW9uKCEgZGlzY292ZXJDbGFzc2VzKTsKLQkJCWxpc3RDbGFzc2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQkKLQkJCW1vZGVsLmFkZExpc3RlbmVyKAotCQkJCQluZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJaWYgKERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJCQkJYm9vbGVhbiBkaXNjb3ZlckNsYXNzZXMgPSAoQm9vbGVhbikgZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQkJCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uLnNldFNlbGVjdGlvbihkaXNjb3ZlckNsYXNzZXMpOwotCQkJCQkJCQlsaXN0Q2xhc3Nlc0J1dHRvbi5zZXRTZWxlY3Rpb24oISBkaXNjb3ZlckNsYXNzZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBPcm1YbWxHcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gY3JlYXRlT3JtWG1sQnV0dG9uOwotCQkKLQkJCi0JCXB1YmxpYyBPcm1YbWxHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0NSRUFURV9PUk0pOwotCQkJCi0JCQljcmVhdGVPcm1YbWxCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJY3JlYXRlT3JtWG1sQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY3JlYXRlT3JtWG1sQnV0dG9uKTsKLQkJCWNyZWF0ZU9ybVhtbEJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9PUk1fWE1MKSk7Ci0JCQljcmVhdGVPcm1YbWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJCW5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX09STV9YTUwsIGNyZWF0ZU9ybVhtbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdKcGFQcm9qZWN0Rmlyc3RQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0pwYVByb2plY3RGaXJzdFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5ZDJlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0pwYVByb2plY3RGaXJzdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5VdGlsaXR5UHJvamVjdEZpcnN0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdKcGFQcm9qZWN0Rmlyc3RQYWdlIGV4dGVuZHMgVXRpbGl0eVByb2plY3RGaXJzdFBhZ2UgCi17Ci0JcHVibGljIE5ld0pwYVByb2plY3RGaXJzdFBhZ2UoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihkYXRhTW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5OZXdKcGFQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdFVpTWVzc2FnZXMuTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbmZvcG9wSUQoSUpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdKcGFQcm9qZWN0V2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0pwYVByb2plY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVmODNhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL05ld0pwYVByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuVXRpbGl0eVByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTmV3SnBhUHJvamVjdFdpemFyZCBleHRlbmRzIFV0aWxpdHlQcm9qZWN0V2l6YXJkIHsKLQotCXB1YmxpYyBOZXdKcGFQcm9qZWN0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLk5ld0pwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQotCXB1YmxpYyBOZXdKcGFQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLk5ld0pwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQkKLQkvLyBUT0RPIC0gd2hlbiB3ZSBoYXZlIGEgZGF0YSBtb2RlbCB0byBhZGQKLS8vCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCgpIHsKLS8vCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLS8vCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuSlBBX1dJWl9CQU5ORVIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgianB0LmpwYS50ZW1wbGF0ZSIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVdpemFyZFBhZ2UgY3JlYXRlRmlyc3RQYWdlKCkgewotCQlyZXR1cm4gbmV3IE5ld0pwYVByb2plY3RGaXJzdFBhZ2UobW9kZWwsICJmaXJzdC5wYWdlIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFQZXJzcGVjdGl2ZSI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL0pwdFVpWG1sTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9KcHRVaVhtbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODA0ZGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL0pwdFVpWG1sTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpwdFVpWG1sTWVzc2FnZXMgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV94bWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX2phdmFDbGFzc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9NZXRhZGF0YUNvbXBsZXRlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX0FjY2Vzc0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9TY2hlbWFEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9DYXRhbG9nRGVmYXVsdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9qYXZhQXR0cmlidXRlTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRW50aXR5TWFwcGluZ3NQYWdlX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRW50aXR5TWFwcGluZ3NQYWdlX0Nhc2NhZGVQZXJzaXN0Q2hlY2tCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRW50aXR5TWFwcGluZ3NQYWdlX1BlcnNpc3RlbmNlVW5pdFNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRW50aXR5TWFwcGluZ3NQYWdlX1NjaGVtYURlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRW50aXR5TWFwcGluZ3NQYWdlX1NjaGVtYU5vRGVmYXVsdFNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxFbnRpdHlNYXBwaW5nc1BhZ2VfQ2F0YWxvZ0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRW50aXR5TWFwcGluZ3NQYWdlX0NhdGFsb2dOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWG1sU2NoZW1hQ2hvb3Nlcl9TY2hlbWFDaG9vc2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhtbENhdGFsb2dDaG9vc2VyX0NhdGFsb2dDaG9vc2VyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWG1sSmF2YUNsYXNzQ2hvb3Nlcl9YbWxKYXZhQ2xhc3NEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWG1sSmF2YUNsYXNzQ2hvb3Nlcl9YbWxKYXZhQ2xhc3NEaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYbWxQYWNrYWdlQ2hvb3Nlcl9QYWNrYWdlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhtbFBhY2thZ2VDaG9vc2VyX1BhY2thZ2VEaWFsb2dfbWVzc2FnZTsgCi0JCi0JCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSnB0VWlYbWxNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSnB0VWlYbWxNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvQWNjZXNzVHlwZUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9BY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZmJhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9BY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFjY2Vzc1R5cGVDb21ib1ZpZXdlciBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBBY2Nlc3NIb2xkZXIgYWNjZXNzSG9sZGVyOwotCXByaXZhdGUgQWRhcHRlciBhY2Nlc3NIb2xkZXJMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIENDb21ib1ZpZXdlciBjb21ib1ZpZXdlcjsKLQotCi0JcHVibGljIEFjY2Vzc1R5cGVDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJYnVpbGRBY2Nlc3NIb2xkZXJMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRBY2Nlc3NIb2xkZXJMaXN0ZW5lcigpIHsKLQkJdGhpcy5hY2Nlc3NIb2xkZXJMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWFjY2Vzc0hvbGRlckNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIgPSBuZXcgQ0NvbWJvVmlld2VyKGNvbWJvKTsKLQkJdGhpcy5jb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkQWNjZXNzVHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkKEFjY2Vzc1R5cGUuVkFMVUVTLnRvQXJyYXkoKSk7Ci0JCQotCQl0aGlzLmNvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQWNjZXNzVHlwZUNvbWJvVmlld2VyLnRoaXMuYWNjZXNzVHlwZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRBY2Nlc3NUeXBlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBBY2Nlc3NUeXBlLkRFRkFVTFQpIHsKLQkJCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5BY2Nlc3NUeXBlQ29tYm9fZGVmYXVsdDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgYWNjZXNzVHlwZVNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlBY2Nlc3NUeXBlIGFjY2VzcyA9IChBY2Nlc3NUeXBlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKCAhIHRoaXMuYWNjZXNzSG9sZGVyLmdldEFjY2VzcygpLmVxdWFscyhhY2Nlc3MpKSB7Ci0JCQkJdGhpcy5hY2Nlc3NIb2xkZXIuc2V0QWNjZXNzKGFjY2Vzcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWNjZXNzSG9sZGVyQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKGFjY2Vzc0hvbGRlci5mZWF0dXJlQ2xhc3MoKSkgPT0gCi0JCQkJdGhpcy5hY2Nlc3NIb2xkZXIuZmVhdHVyZUlkKCkpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmFjY2Vzc0hvbGRlciAhPSBudWxsICYmIHRoaXMuYWNjZXNzSG9sZGVyLndyYXBwZWRPYmplY3QoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFjY2Vzc0hvbGRlci53cmFwcGVkT2JqZWN0KCkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuYWNjZXNzSG9sZGVyTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuYWNjZXNzSG9sZGVyICE9IG51bGwgJiYgdGhpcy5hY2Nlc3NIb2xkZXIud3JhcHBlZE9iamVjdCgpICE9IG51bGwpIHsKLQkJCXRoaXMuYWNjZXNzSG9sZGVyLndyYXBwZWRPYmplY3QoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5hY2Nlc3NIb2xkZXJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgcG9wdWxhdGUoQWNjZXNzSG9sZGVyIGFjY2Vzc0hvbGRlcikgewotCQlzdXBlci5wb3B1bGF0ZShhY2Nlc3NIb2xkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5hY2Nlc3NIb2xkZXIgPSAoQWNjZXNzSG9sZGVyKSBvYmo7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQkJaWYgKHRoaXMuYWNjZXNzSG9sZGVyLndyYXBwZWRPYmplY3QoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUFjY2Vzc1R5cGUgYWNjZXNzID0gdGhpcy5hY2Nlc3NIb2xkZXIuZ2V0QWNjZXNzKCk7Ci0JCQotCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gYWNjZXNzKSB7Ci0JCQl0aGlzLmNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhY2Nlc3MpKTsKLQkJfQotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCk7Ci0JfQotCQotCS8qKgotCSAqIEFuIGludGVyZmFjZSB0byB3cmFwIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIGFjY2Vzc1R5cGUKLQkgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIG11c3QgYmUgcGFzc2VkIGluIHRvIHBvcHVsYXRlKEVPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQWNjZXNzSG9sZGVyIGV4dGVuZHMgRU9iamVjdCB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIEFjY2Vzc1R5cGUgZnJvbSB0aGUgd3JhcHBlZCBvYmplY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKLQkJCi0JCS8qKgotCQkgKiBTZXQgdGhlIEFjY2Vzc1R5cGUgb24gdGhlIHdyYXBwZWQgb2JqZWN0Ci0JCSAqIEBwYXJhbSBhY2Nlc3NUeXBlCi0JCSAqLwotCQl2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgQ2xhc3Mgb2YgdGhlIHdyYXBwZWQgb2JqZWN0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCUNsYXNzIGZlYXR1cmVDbGFzcygpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZmVhdHVyZSBpZCBvZiBhY2Nlc3NUeXBlIG9uIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlpbnQgZmVhdHVyZUlkKCk7Ci0JCQotCQkvKioKLQkJICogVGhlIHdyYXBwZWQgRU9iamVjdCB0aGF0IHRoZSBhY2Nlc3NUeXBlIGlzIHN0b3JlZCBvbgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlFT2JqZWN0IHdyYXBwZWRPYmplY3QoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9DYXNjYWRlUGVyc2lzdENoZWNrQm94LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9DYXNjYWRlUGVyc2lzdENoZWNrQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjA3OWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvQ2FzY2FkZVBlcnNpc3RDaGVja0JveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLkpwdFVpWG1sTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDYXNjYWRlUGVyc2lzdENoZWNrQm94IGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCXByaXZhdGUgQWRhcHRlciBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0xpc3RlbmVyOwotCQotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQotCi0JcHVibGljIENhc2NhZGVQZXJzaXN0Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkUGVyaXN0ZW5jZVVuaXREZWZhdWx0c0xpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFBlcmlzdGVuY2VVbml0RGVmYXVsdHNMaXN0ZW5lcigpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0xpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFyZW50LCAKLQkJCQkJCUpwdFVpWG1sTWVzc2FnZXMuWE1MRW50aXR5TWFwcGluZ3NQYWdlX0Nhc2NhZGVQZXJzaXN0Q2hlY2tCb3gsCi0JCQkJCQlTV1QuQ0hFQ0spOwotCQkKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDYXNjYWRlUGVyc2lzdENoZWNrQm94LnRoaXMuY2FzY2FkZVBlcnNpc3RTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlUGVyc2lzdENoZWNrQm94LnRoaXMuY2FzY2FkZVBlcnNpc3RTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQl2b2lkIGNhc2NhZGVQZXJzaXN0U2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJYm9vbGVhbiBjYXNjYWRlUGVyc2lzdCA9IHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkgIT0gY2FzY2FkZVBlcnNpc3QpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoY2FzY2FkZVBlcnNpc3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzKSA9PSAKLQkJCQlPcm1QYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVCkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5lQWRhcHRlcnMoKS5hZGQodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHNMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBvYmo7Ci0JCXBvcHVsYXRlQnV0dG9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQnV0dG9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUJ1dHRvbigpIHsKLQkJYm9vbGVhbiBjYXNjYWRlUGVyc2lzdCA9IGZhbHNlOwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAhPSBudWxsKSB7Ci0JCQljYXNjYWRlUGVyc2lzdCAgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKTsKLQkJfQotCQkKLQkJaWYgKHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpICE9IGNhc2NhZGVQZXJzaXN0KSB7Ci0JCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24oY2FzY2FkZVBlcnNpc3QpOwotCQl9Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL0NvbW1vbldpZGdldHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL0NvbW1vbldpZGdldHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlNWMyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9Db21tb25XaWRnZXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5TdHJpbmdXaXRoRGVmYXVsdENob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5KcHRVaVhtbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENvbW1vbldpZGdldHMgCi17Ci0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZEphdmFDbGFzc0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJTGFiZWwgbGFiZWwgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgSnB0VWlYbWxNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfamF2YUNsYXNzTGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgWG1sSmF2YUNsYXNzQ2hvb3NlciBidWlsZEphdmFDbGFzc0Nob29zZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgWG1sSmF2YUNsYXNzQ2hvb3NlcihwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRKYXZhQXR0cmlidXRlTmFtZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJTGFiZWwgbGFiZWwgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgSnB0VWlYbWxNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9qYXZhQXR0cmlidXRlTGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgWG1sSmF2YUF0dHJpYnV0ZUNob29zZXIgYnVpbGRKYXZhQXR0cmlidXRlQ2hvb3NlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBYbWxKYXZhQXR0cmlidXRlQ2hvb3NlcihwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRBY2Nlc3NMYWJlbChDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgSnB0VWlYbWxNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfQWNjZXNzTGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFjY2Vzc1R5cGVDb21ib1ZpZXdlciBidWlsZEFjY2Vzc1R5cGVDb21ib1ZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRDYXRhbG9nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpWG1sTWVzc2FnZXMuWG1sQ2F0YWxvZ0Nob29zZXJfQ2F0YWxvZ0Nob29zZXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1dpdGhEZWZhdWx0Q2hvb3NlciBidWlsZENhdGFsb2dDaG9vc2VyKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1dpdGhEZWZhdWx0Q2hvb3NlcihwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZFNjaGVtYUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaVhtbE1lc3NhZ2VzLlhtbFNjaGVtYUNob29zZXJfU2NoZW1hQ2hvb3Nlcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyIGJ1aWxkU2NoZW1hQ2hvb3NlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRQYWNrYWdlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsICJQYWNrYWdlOiIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhtbFBhY2thZ2VDaG9vc2VyIGJ1aWxkWG1sUGFja2FnZUNob29zZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgWG1sUGFja2FnZUNob29zZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvTWV0YURhdGFDb21wbGV0ZUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9NZXRhRGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ODcxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9NZXRhRGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdEZhbHNlQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFDb21wbGV0ZUNvbWJvVmlld2VyIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIFhtbFR5cGVNYXBwaW5nIG1hcHBpbmc7Ci0JcHJpdmF0ZSBBZGFwdGVyIHR5cGVNYXBwaW5nTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQotCXB1YmxpYyBNZXRhRGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkVHlwZU1hcHBpbmdMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUeXBlTWFwcGluZ0xpc3RlbmVyKCkgewotCQl0aGlzLnR5cGVNYXBwaW5nTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQl0eXBlTWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIgPSBuZXcgQ0NvbWJvVmlld2VyKGNvbWJvKTsKLQkJdGhpcy5jb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQkJdGhpcy5jb21ib1ZpZXdlci5hZGQoRGVmYXVsdEZhbHNlQm9vbGVhbi5WQUxVRVMudG9BcnJheSgpKTsKLQkJdGhpcy5jb21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU1ldGFEYXRhQ29tcGxldGVDb21ib1ZpZXdlci50aGlzLm1ldGFkYXRhQ29tcGxldGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBEZWZhdWx0RmFsc2VCb29sZWFuLkRFRkFVTFQpIHsKLQkJCQkJLy9UT0RPIG5lZWQgdG8gbW92ZSB0aGlzIHRvIHRoZSBtb2RlbCwgZG9uJ3Qgd2FudCBoYXJkY29kZWQgU3RyaW5nCi0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuTWV0YURhdGFDb21wbGV0ZUNvbWJvX0RlZmF1bHQsICJGYWxzZSIpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIG1ldGFkYXRhQ29tcGxldGVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJRGVmYXVsdEZhbHNlQm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlID0gKERlZmF1bHRGYWxzZUJvb2xlYW4pICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoICEgdGhpcy5tYXBwaW5nLmdldE1ldGFkYXRhQ29tcGxldGUoKS5lcXVhbHMobWV0YWRhdGFDb21wbGV0ZSkpIHsKLQkJCQl0aGlzLm1hcHBpbmcuc2V0TWV0YWRhdGFDb21wbGV0ZShtZXRhZGF0YUNvbXBsZXRlKTsKLS8vCQkJCXRoaXMuZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKAotLy8JCQkJCVNldENvbW1hbmQuY3JlYXRlKAotLy8JCQkJCQl0aGlzLmVkaXRpbmdEb21haW4sCi0vLwkJCQkJCXRoaXMuYmFzaWNNYXBwaW5nLAotLy8JCQkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNpY01hcHBpbmdfT3B0aW9uYWwoKSwKLS8vCQkJCQkJb3B0aW9uYWwKLS8vCQkJCQkpCi0vLwkJCQkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHR5cGVNYXBwaW5nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFhtbFR5cGVNYXBwaW5nLmNsYXNzKSA9PSAKLQkJCQlPcm1QYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5tYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMubWFwcGluZy5lQWRhcHRlcnMoKS5hZGQodGhpcy50eXBlTWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBwaW5nLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnR5cGVNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5tYXBwaW5nID0gKFhtbFR5cGVNYXBwaW5nKSBvYmo7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQkJaWYgKHRoaXMubWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCURlZmF1bHRGYWxzZUJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSA9IG1hcHBpbmcuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCQkKLQkJaWYgKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IG1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXRoaXMuY29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1ldGFkYXRhQ29tcGxldGUpKTsKLQkJfQotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZDljOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlhtbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlN0cmluZ1dpdGhEZWZhdWx0Q2hvb3Nlci5TdHJpbmdIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5KcHRVaVhtbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24gZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCQotCXByaXZhdGUgU2VjdGlvbiBzZWN0aW9uOwotCXByaXZhdGUgWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94OwotCXByaXZhdGUgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyIHhtbFNjaGVtYUNob29zZXI7Ci0JcHJpdmF0ZSBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIgeG1sQ2F0YWxvZ0Nob29zZXI7Ci0JcHJpdmF0ZSBBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIgYWNjZXNzQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBDYXNjYWRlUGVyc2lzdENoZWNrQm94IGNhc2NhZGVQZXJzaXN0Q2hlY2tCb3g7Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JICAgIHRoaXMuc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0JICAgIHRoaXMuc2VjdGlvbi5zZXRUZXh0KEpwdFVpWG1sTWVzc2FnZXMuWE1MRW50aXR5TWFwcGluZ3NQYWdlX1BlcnNpc3RlbmNlVW5pdFNlY3Rpb24pOwotCi0JCUNvbXBvc2l0ZSBwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHRoaXMuc2VjdGlvbik7Ci0JCXRoaXMuc2VjdGlvbi5zZXRDbGllbnQocGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxOwotCQlwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkgICAgCi0JICAgIHRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveCA9IGJ1aWxkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveChwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3guZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9YTUwpOwotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFNjaGVtYUxhYmVsKHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMueG1sU2NoZW1hQ2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRTY2hlbWFDaG9vc2VyKHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy54bWxTY2hlbWFDaG9vc2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh4bWxTY2hlbWFDaG9vc2VyLmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fU0NIRU1BKTsKLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkQ2F0YWxvZ0xhYmVsKHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMueG1sQ2F0YWxvZ0Nob29zZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkQ2F0YWxvZ0Nob29zZXIocGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh4bWxDYXRhbG9nQ2hvb3Nlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBVEFMT0cpOwotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZEFjY2Vzc0xhYmVsKHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkQWNjZXNzVHlwZUNvbWJvVmlld2VyKHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY2Nlc3NDb21ib1ZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0FDQ0VTUyk7Ci0KLQkKLQkgICAgdGhpcy5jYXNjYWRlUGVyc2lzdENoZWNrQm94ID0gYnVpbGRDYXNjYWRlUGVyc2lzdENoZWNrQm94KHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0Q2hlY2tCb3guZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoY2FzY2FkZVBlcnNpc3RDaGVja0JveC5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBU0NBREUpOwotCi0JfQotCQotCXByaXZhdGUgWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveCBidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gocGFyZW50LCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDYXNjYWRlUGVyc2lzdENoZWNrQm94IGJ1aWxkQ2FzY2FkZVBlcnNpc3RDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ2FzY2FkZVBlcnNpc3RDaGVja0JveChwYXJlbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKSBvYmo7Ci0JCXRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveC5wb3B1bGF0ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBNeUFjY2Vzc0hvbGRlcihwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKSk7Ci0JCQl0aGlzLnhtbFNjaGVtYUNob29zZXIucG9wdWxhdGUobmV3IFNjaGVtYUhvbGRlcihwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKSk7Ci0JCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLnBvcHVsYXRlKG5ldyBDYXRhbG9nSG9sZGVyKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpKTsKLQkJCXRoaXMuY2FzY2FkZVBlcnNpc3RDaGVja0JveC5wb3B1bGF0ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIucG9wdWxhdGUobmV3IE15QWNjZXNzSG9sZGVyKG51bGwpKTsJCQkKLQkJCXRoaXMueG1sU2NoZW1hQ2hvb3Nlci5wb3B1bGF0ZShuZXcgU2NoZW1hSG9sZGVyKG51bGwpKTsJCQkKLQkJCXRoaXMueG1sQ2F0YWxvZ0Nob29zZXIucG9wdWxhdGUobmV3IENhdGFsb2dIb2xkZXIobnVsbCkpOwkJCQotCQkJdGhpcy5jYXNjYWRlUGVyc2lzdENoZWNrQm94LnBvcHVsYXRlKG51bGwpOwkJCQotCQl9Ci0JfQotCXByaXZhdGUgY2xhc3MgTXlBY2Nlc3NIb2xkZXIgZXh0ZW5kcyBYbWxFT2JqZWN0IGltcGxlbWVudHMgQWNjZXNzSG9sZGVyewotCQkKLQkJcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQlNeUFjY2Vzc0hvbGRlcihQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsKSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhhY2Nlc3NUeXBlKTsKLQkJfQotCQotCQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIE9ybVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBTY2hlbWFIb2xkZXIgZXh0ZW5kcyBYbWxFT2JqZWN0IGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJU2NoZW1hSG9sZGVyKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBPcm1QYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWZhdWx0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGRlZmF1bHRGZWF0dXJlSWQoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0SXRlbSgpIHsKLQkJCXJldHVybiBKcHRVaVhtbE1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9TY2hlbWFEZWZhdWx0OwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld1NjaGVtYSkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTY2hlbWEobmV3U2NoZW1hKTsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgQ2F0YWxvZ0hvbGRlciBleHRlbmRzIFhtbEVPYmplY3QgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQlDYXRhbG9nSG9sZGVyKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBPcm1QYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVmYXVsdCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEl0ZW0oKSB7Ci0JCQlyZXR1cm4gSnB0VWlYbWxNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fQ2F0YWxvZ0RlZmF1bHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXRhbG9nKHN0cmluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJfQotCQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gucG9wdWxhdGUoKTsKLQkJdGhpcy54bWxTY2hlbWFDaG9vc2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMueG1sQ2F0YWxvZ0Nob29zZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0Q2hlY2tCb3gucG9wdWxhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LmRpc3Bvc2UoKTsKLQkJdGhpcy54bWxTY2hlbWFDaG9vc2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy54bWxDYXRhbG9nQ2hvb3Nlci5kaXNwb3NlKCk7Ci0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0Q2hlY2tCb3guZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQkKLQkKLQlwdWJsaWMgU2VjdGlvbiBnZXRTZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5zZWN0aW9uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZ2V0U2VjdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjZDcwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLklYbWxDb250ZW50Tm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWG1sRGV0YWlsc1Byb3ZpZGVyIAotCWltcGxlbWVudHMgSUpwYURldGFpbHNQcm92aWRlciAKLXsKLQlwdWJsaWMgWG1sRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGZpbGVDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBJSnBhRGV0YWlsc1BhZ2UgYnVpbGREZXRhaWxzUGFnZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUsIE9iamVjdCBjb250ZW50Tm9kZUlkLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCWlmIChjb250ZW50Tm9kZUlkLmVxdWFscyhJWG1sQ29udGVudE5vZGVzLkVOVElUWV9NQVBQSU5HU19JRCkpIHsKLQkJCXJldHVybiBuZXcgWG1sRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShwYXJlbnRDb21wb3NpdGUsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnROb2RlSWQuZXF1YWxzKElYbWxDb250ZW50Tm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEKSkgewotCQkJcmV0dXJuIG5ldyBYbWxQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKHBhcmVudENvbXBvc2l0ZSwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudE5vZGVJZC5lcXVhbHMoSVhtbENvbnRlbnROb2Rlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JRCkpIHsKLQkJCXJldHVybiBuZXcgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKHBhcmVudENvbXBvc2l0ZSwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBubyBvcCAuLi4gZm9yIG5vdwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwYmRlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5YbWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLkVudGl0eU1hcHBpbmdzSW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5TdHJpbmdXaXRoRGVmYXVsdENob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyLlN0cmluZ0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLkpwdFVpWG1sTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21ib1ZpZXdlci5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIGV4dGVuZHMgQmFzZUpwYURldGFpbHNQYWdlCi17Ci0JcHJpdmF0ZSBFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5nczsKLQotCXByaXZhdGUgWG1sUGFja2FnZUNob29zZXIgeG1sUGFja2FnZUNob29zZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIgeG1sU2NoZW1hQ2hvb3NlcjsKLQkKLQlwcml2YXRlIFN0cmluZ1dpdGhEZWZhdWx0Q2hvb3NlciB4bWxDYXRhbG9nQ2hvb3NlcjsKLQkKLQlwcml2YXRlIEFjY2Vzc1R5cGVDb21ib1ZpZXdlciBhY2Nlc3NDb21ib1ZpZXdlcjsKLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbiBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb247Ci0JCi0JcHVibGljIFhtbEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gNjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0KLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFBhY2thZ2VMYWJlbChjb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLnhtbFBhY2thZ2VDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZFhtbFBhY2thZ2VDaG9vc2VyKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy54bWxQYWNrYWdlQ2hvb3Nlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh4bWxQYWNrYWdlQ2hvb3Nlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1BBQ0tBR0UpOwotCi0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkU2NoZW1hTGFiZWwoY29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJdGhpcy54bWxTY2hlbWFDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZFNjaGVtYUNob29zZXIoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnhtbFNjaGVtYUNob29zZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHhtbFNjaGVtYUNob29zZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9TQ0hFTUEpOwotCi0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkQ2F0YWxvZ0xhYmVsKGNvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMueG1sQ2F0YWxvZ0Nob29zZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkQ2F0YWxvZ0Nob29zZXIoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh4bWxDYXRhbG9nQ2hvb3Nlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX0NBVEFMT0cpOwotCQkKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRBY2Nlc3NMYWJlbChjb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEFjY2Vzc1R5cGVDb21ib1ZpZXdlcihjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoYWNjZXNzQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9BQ0NFU1MpOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24gPSBuZXcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24uZ2V0U2VjdGlvbigpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoSUpwYUNvbnRlbnROb2RlIGNvbnRlbnROb2RlKSB7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3MpIGNvbnRlbnROb2RlOwotCQl0aGlzLnhtbFBhY2thZ2VDaG9vc2VyLnBvcHVsYXRlKHRoaXMuZW50aXR5TWFwcGluZ3MpOwotCQl0aGlzLnhtbFNjaGVtYUNob29zZXIucG9wdWxhdGUobmV3IFNjaGVtYUhvbGRlcih0aGlzLmVudGl0eU1hcHBpbmdzKSk7Ci0JCXRoaXMueG1sQ2F0YWxvZ0Nob29zZXIucG9wdWxhdGUobmV3IENhdGFsb2dIb2xkZXIodGhpcy5lbnRpdHlNYXBwaW5ncykpOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBNeUFjY2Vzc0hvbGRlcih0aGlzLmVudGl0eU1hcHBpbmdzKSk7CQotCQlpZiAodGhpcy5lbnRpdHlNYXBwaW5ncyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbi5wb3B1bGF0ZSh0aGlzLmVudGl0eU1hcHBpbmdzLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24ucG9wdWxhdGUobnVsbCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLnhtbFBhY2thZ2VDaG9vc2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMueG1sU2NoZW1hQ2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24ucG9wdWxhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy54bWxQYWNrYWdlQ2hvb3Nlci5kaXNwb3NlKCk7Ci0JCXRoaXMueG1sU2NoZW1hQ2hvb3Nlci5kaXNwb3NlKCk7Ci0JCXRoaXMueG1sQ2F0YWxvZ0Nob29zZXIuZGlzcG9zZSgpOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24uZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQotCQotCXByaXZhdGUgY2xhc3MgTXlBY2Nlc3NIb2xkZXIgZXh0ZW5kcyBYbWxFT2JqZWN0IGltcGxlbWVudHMgQWNjZXNzSG9sZGVyewotCQkKLQkJcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzOwotCQlNeUFjY2Vzc0hvbGRlcihFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3NJbnRlcm5hbCkgZW50aXR5TWFwcGluZ3M7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgewotCQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkQWNjZXNzKGFjY2Vzc1R5cGUpOwotCQl9Ci0JCi0JCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJCXJldHVybiBlbnRpdHlNYXBwaW5ncy5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBFbnRpdHlNYXBwaW5nc0ludGVybmFsLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBPcm1QYWNrYWdlLkVOVElUWV9NQVBQSU5HU19JTlRFUk5BTF9fU1BFQ0lGSUVEX0FDQ0VTUzsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFNjaGVtYUhvbGRlciBleHRlbmRzIFhtbEVPYmplY3QgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQlwcml2YXRlIEVudGl0eU1hcHBpbmdzSW50ZXJuYWwgZW50aXR5TWFwcGluZ3M7Ci0JCVNjaGVtYUhvbGRlcihFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3NJbnRlcm5hbCkgZW50aXR5TWFwcGluZ3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gRW50aXR5TWFwcGluZ3NJbnRlcm5hbC5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gT3JtUGFja2FnZS5FTlRJVFlfTUFQUElOR1NfSU5URVJOQUxfX1NQRUNJRklFRF9TQ0hFTUE7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVmYXVsdCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGRlZmF1bHRGZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gT3JtUGFja2FnZS5FTlRJVFlfTUFQUElOR1NfSU5URVJOQUxfX0RFRkFVTFRfU0NIRU1BOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRJdGVtKCkgewotCQkJU3RyaW5nIGRlZmF1bHRTY2hlbWEgPSB0aGlzLmVudGl0eU1hcHBpbmdzLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCWlmIChkZWZhdWx0U2NoZW1hICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlYbWxNZXNzYWdlcy5YTUxFbnRpdHlNYXBwaW5nc1BhZ2VfU2NoZW1hRGVmYXVsdCwgZGVmYXVsdFNjaGVtYSk7Ci0JCQl9Ci0JCQlyZXR1cm4gSnB0VWlYbWxNZXNzYWdlcy5YTUxFbnRpdHlNYXBwaW5nc1BhZ2VfU2NoZW1hTm9EZWZhdWx0U3BlY2lmaWVkOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld1NjaGVtYSkgewotCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRTcGVjaWZpZWRTY2hlbWEobmV3U2NoZW1hKTsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgQ2F0YWxvZ0hvbGRlciBleHRlbmRzIFhtbEVPYmplY3QgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQlwcml2YXRlIEVudGl0eU1hcHBpbmdzSW50ZXJuYWwgZW50aXR5TWFwcGluZ3M7Ci0JCUNhdGFsb2dIb2xkZXIoRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gKEVudGl0eU1hcHBpbmdzSW50ZXJuYWwpIGVudGl0eU1hcHBpbmdzOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzSW50ZXJuYWwuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIE9ybVBhY2thZ2UuRU5USVRZX01BUFBJTkdTX0lOVEVSTkFMX19TUEVDSUZJRURfQ0FUQUxPRzsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWZhdWx0KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZGVmYXVsdEZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBPcm1QYWNrYWdlLkVOVElUWV9NQVBQSU5HU19JTlRFUk5BTF9fREVGQVVMVF9DQVRBTE9HOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRJdGVtKCkgewotCQkJU3RyaW5nIGRlZmF1bHRDYXRhbG9nID0gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQkJaWYgKGRlZmF1bHRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlYbWxNZXNzYWdlcy5YTUxFbnRpdHlNYXBwaW5nc1BhZ2VfQ2F0YWxvZ0RlZmF1bHQsIGRlZmF1bHRDYXRhbG9nKTsKLQkJCX0KLQkJCXJldHVybiBKcHRVaVhtbE1lc3NhZ2VzLlhNTEVudGl0eU1hcHBpbmdzUGFnZV9DYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBuZXdDYXRhbG9nKSB7Ci0JCQl0aGlzLmVudGl0eU1hcHBpbmdzLnNldFNwZWNpZmllZENhdGFsb2cobmV3Q2F0YWxvZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5nczsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbEphdmFBdHRyaWJ1dGVDaG9vc2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxKYXZhQXR0cmlidXRlQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU4YmU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbEphdmFBdHRyaWJ1dGVDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWG1sSmF2YUF0dHJpYnV0ZUNob29zZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0JcHJpdmF0ZSBBZGFwdGVyIHBlcnNpc3RlbnRBdHRyaWJ1dGVMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIFRleHQgdGV4dDsKLQkKLQkKLQlwdWJsaWMgWG1sSmF2YUF0dHJpYnV0ZUNob29zZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkUGVyc2lzdGVudEF0dHJpYnV0ZUxpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFBlcnNpc3RlbnRBdHRyaWJ1dGVMaXN0ZW5lcigpIHsKLQkJdGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlwZXJzaXN0ZW50QXR0cmlidXRlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChwYXJlbnQsICIiKTsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJdGV4dE1vZGlmaWVkKGUpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGV4dE1vZGlmaWVkKE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyB0ZXh0ID0gKChUZXh0KSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCWF0dHJpYnV0ZS5zZXROYW1lKHRleHQpOwotCQkKLQkJLy8gVE9ETyBEb2VzIHRoaXMgbmVlZCB0byBiZSBkb25lPwotCQkvL3RoaXMuZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKFNldENvbW1hbmQuY3JlYXRlKHRoaXMuZWRpdGluZ0RvbWFpbiwgdGhpcy5lbnRpdHksIE1hcHBpbmdzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1NwZWNpZmllZE5hbWUoKSwgdGV4dCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGVyc2lzdGVudEF0dHJpYnV0ZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKSA9PSAKLQkJCQlPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5UX0FUVFJJQlVURV9fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGUuZUFkYXB0ZXJzKCkuYWRkKHBlcnNpc3RlbnRBdHRyaWJ1dGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCWF0dHJpYnV0ZS5lQWRhcHRlcnMoKS5yZW1vdmUocGVyc2lzdGVudEF0dHJpYnV0ZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCWF0dHJpYnV0ZSA9IChvYmogPT0gbnVsbCkgPyBudWxsIDogKChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBvYmopLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJcG9wdWxhdGVUZXh0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlVGV4dCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVUZXh0KCkgewotCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLQkJCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9ICIiOwotCQl9Ci0JCXNldFRleHREYXRhKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGV4dERhdGEoU3RyaW5nIHRleHREYXRhKSB7Ci0JCWlmICghIHRleHREYXRhLmVxdWFscyh0ZXh0LmdldFRleHQoKSkpIHsKLQkJCXRleHQuc2V0VGV4dCh0ZXh0RGF0YSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sSmF2YUNsYXNzQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sSmF2YUNsYXNzQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2ZlYWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbEphdmFDbGFzc0Nob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuSnB0VWlYbWxNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8vVE9ETyBwb3NzaWJseSBoZWxwIHRoZSB1c2VyIGFuZCBpZiB0aGV5IGhhdmUgY2hvc2VuIGEgcGFja2FnZSBhdCB0aGUgZW50aXR5LW1hcHBpbmdzIGxldmVsCi0vL29ubHkgaW5zZXJ0IHRoZSBjbGFzcyBuYW1lIGluIHRoZSB4bWwgZmlsZSBpZiB0aGV5IGNob29zZSBhIGNsYXNzIGZyb20gdGhlIHBhY2thZ2UuICAKLS8vTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgZHJpdmVuIGJ5IHRoZSBVSSBvciBieSB1aSBhcGkgaW4gdGhlIG1vZGVsCi1wdWJsaWMgY2xhc3MgWG1sSmF2YUNsYXNzQ2hvb3NlciBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBYbWxQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTsKLQlwcml2YXRlIEFkYXB0ZXIgcGVyc2lzdGVudFR5cGVMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JcHJpdmF0ZSBKYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yOwotCQotCXB1YmxpYyBYbWxKYXZhQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZFBlcnNpc3RlbnRUeXBlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGVyc2lzdGVudFR5cGVMaXN0ZW5lcigpIHsKLQkJcGVyc2lzdGVudFR5cGVMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXBlcnNpc3RlbnRUeXBlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCSAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAxOwotCSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCSAgICB0aGlzLmNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JICAgIAotCQl0ZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQodGhpcy5jb21wb3NpdGUsICIiKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCSAgICB0aGlzLnRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJdGV4dE1vZGlmaWVkKGUpOwotCQkJCX0KLQkJCX0pOwotCi0JCS8vVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKLQkJdGhpcy5qYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yKGZhbHNlLCBmYWxzZSk7Ci0JCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZVRleHRDb250ZW50QXNzaXN0YW50KHRoaXMudGV4dCwgIHRoaXMuamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yKTsKLQotCQkKLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24odGhpcy5jb21wb3NpdGUsICJCcm93c2UuLi4iLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVR5cGUgdHlwZSA9IGNob29zZVR5cGUoKTsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCXRleHQuc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQl0ZXh0LnNldFRleHQodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXh0TW9kaWZpZWQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIHRleHQgPSAoKFRleHQpIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJcGVyc2lzdGVudFR5cGUuc2V0Q2xhc3ModGV4dCk7Ci0JCQotCQkvLyBUT0RPIERvZXMgdGhpcyBuZWVkIHRvIGJlIGRvbmU/Ci0JCS8vdGhpcy5lZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoU2V0Q29tbWFuZC5jcmVhdGUodGhpcy5lZGl0aW5nRG9tYWluLCB0aGlzLmVudGl0eSwgTWFwcGluZ3NQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfU3BlY2lmaWVkTmFtZSgpLCB0ZXh0KSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQotCQkKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IHJvb3QuZ2V0SmF2YVByb2plY3QoKSB9OwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCi0JCVNlbGVjdGlvbkRpYWxvZyB0eXBlU2VsZWN0aW9uRGlhbG9nOwotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKHRoaXMudGV4dC5nZXRTaGVsbCgpLCBzZXJ2aWNlLCBzY29wZSwgSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsIGZhbHNlLCBnZXRUeXBlKCkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRVaVhtbE1lc3NhZ2VzLlhtbEphdmFDbGFzc0Nob29zZXJfWG1sSmF2YUNsYXNzRGlhbG9nX3RpdGxlKTsgCi0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRVaVhtbE1lc3NhZ2VzLlhtbEphdmFDbGFzc0Nob29zZXJfWG1sSmF2YUNsYXNzRGlhbG9nX21lc3NhZ2UpOyAKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0LmdldFRleHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5wZXJzaXN0ZW50VHlwZS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3Qgcm9vdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCXJldHVybiByb290LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcnNpc3RlbnRUeXBlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFhtbFBlcnNpc3RlbnRUeXBlLmNsYXNzKSA9PSAKLQkJCQlPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5UX1RZUEVfX0NMQVNTKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJcGVyc2lzdGVudFR5cGUuZUFkYXB0ZXJzKCkuYWRkKHBlcnNpc3RlbnRUeXBlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXBlcnNpc3RlbnRUeXBlLmVBZGFwdGVycygpLnJlbW92ZShwZXJzaXN0ZW50VHlwZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXBlcnNpc3RlbnRUeXBlID0gKG9iaiA9PSBudWxsKSA/IG51bGwgOiAoKFhtbFR5cGVNYXBwaW5nKSBvYmopLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCXBvcHVsYXRlVGV4dCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZVRleHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGV4dCgpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJaWYgKHJvb3QgIT0gbnVsbCkgewotCQkJIHRoaXMuamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yLnNldFBhY2thZ2VGcmFnbWVudChyb290LmdldFBhY2thZ2VGcmFnbWVudCgiIikpOwotCQl9Ci0JCQotCi0JCVN0cmluZyBqYXZhQ2xhc3MgPSBwZXJzaXN0ZW50VHlwZS5nZXRDbGFzc18oKTsKLQkJCi0JCWlmIChqYXZhQ2xhc3MgPT0gbnVsbCkgewotCQkJc2V0VGV4dERhdGEoIiIpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0VGV4dERhdGEoamF2YUNsYXNzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGV4dERhdGEoU3RyaW5nIHRleHREYXRhKSB7Ci0JCWlmICghIHRleHREYXRhLmVxdWFscyh0ZXh0LmdldFRleHQoKSkpIHsKLQkJCXRleHQuc2V0VGV4dCh0ZXh0RGF0YSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkZDAzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuSnB0VWlYbWxNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3ggZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0JcHJpdmF0ZSBBZGFwdGVyIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYnV0dG9uOwotCi0KLQlwdWJsaWMgWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJYnVpbGRQZXJpc3RlbmNlVW5pdE1ldGFkYXRhTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGVyaXN0ZW5jZVVuaXRNZXRhZGF0YUxpc3RlbmVyKCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYXJlbnQsIAotCQkJCQkJSnB0VWlYbWxNZXNzYWdlcy5YTUxFbnRpdHlNYXBwaW5nc1BhZ2VfWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveCwKLQkJCQkJCVNXVC5DSEVDSyk7Ci0JCQotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gudGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gudGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXZvaWQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlib29sZWFuIHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gdGhpcy5idXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSAhPSB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MpID09IAotCQkJCU9ybVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IChQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSkgb2JqOwotCQlwb3B1bGF0ZUJ1dHRvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZUJ1dHRvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVCdXR0b24oKSB7Ci0JCWJvb2xlYW4geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSBmYWxzZTsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgIT0gbnVsbCkgewotCQkJeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAhPSB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSkgewotCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKTsKLQkJfQotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxQYWNrYWdlQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sUGFja2FnZUNob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhZjQ1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxQYWNrYWdlQ2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlhtbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uRW50aXR5TWFwcGluZ3NJbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLkpwdFVpWG1sTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxQYWNrYWdlQ2hvb3NlciBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzOwotCXByaXZhdGUgQWRhcHRlciBlbnRpdHlNYXBwaW5nc0xpc3RlbmVyOwotICAgIHByaXZhdGUgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQkKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JCi0JCi0JcHVibGljIFhtbFBhY2thZ2VDaG9vc2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZFNjaGVtYUhvbGRlckxpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFNjaGVtYUhvbGRlckxpc3RlbmVyKCkgewotCQl0aGlzLmVudGl0eU1hcHBpbmdzTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQllbnRpdHlNYXBwaW5nc0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQkgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMTsKLQkgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkgICAgdGhpcy5jb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQl0aGlzLnRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dCh0aGlzLmNvbXBvc2l0ZSwgIiIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JICAgIHRoaXMudGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aGlzLmNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yKG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfUk9PVCkpOwotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCh0aGlzLnRleHQsIHRoaXMuY29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0KLQkgICAgdGhpcy50ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQl0ZXh0TW9kaWZpZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0JICAgIAotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbih0aGlzLmNvbXBvc2l0ZSwgIkJyb3dzZS4uLiIsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGNob29zZVBhY2thZ2UoKTsKLQkJCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpIHsKLQkJCQkJdGV4dC5zZXRUZXh0KHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gY2hvb3NlUGFja2FnZSgpOwotCQkJCWlmIChwYWNrYWdlRnJhZ21lbnQgIT0gbnVsbCkgewotCQkJCQl0ZXh0LnNldFRleHQocGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0ZXh0TW9kaWZpZWQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIHRleHQgPSAoKFRleHQpIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRQYWNrYWdlKHRleHQpOwotCQkvL1RPRE8gc2V0IGEgSkVNIFBhY2thZ2U/PwotCQkvLy5zZXRKYXZhQ2xhc3MoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHRleHQpKTsKLQkJCi0JCS8vIFRPRE8gRG9lcyB0aGlzIG5lZWQgdG8gYmUgZG9uZT8KLQkJLy90aGlzLmVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShTZXRDb21tYW5kLmNyZWF0ZSh0aGlzLmVkaXRpbmdEb21haW4sIHRoaXMuZW50aXR5LCBNYXBwaW5nc1BhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eV9TcGVjaWZpZWROYW1lKCksIHRleHQpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVudGl0eU1hcHBpbmdzQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVudGl0eU1hcHBpbmdzLmNsYXNzKSA9PSAKLQkJCQlPcm1QYWNrYWdlLkVOVElUWV9NQVBQSU5HU19fUEFDS0FHRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgewotCQkJZW50aXR5TWFwcGluZ3MuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuZW50aXR5TWFwcGluZ3NMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbnRpdHlNYXBwaW5ncyAhPSBudWxsKSB7Ci0JCQl0aGlzLmVudGl0eU1hcHBpbmdzLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmVudGl0eU1hcHBpbmdzTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IChFbnRpdHlNYXBwaW5nc0ludGVybmFsKSBvYmo7Ci0JCXBvcHVsYXRlVGV4dCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZVRleHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGV4dCgpIHsKLQkJaWYgKGVudGl0eU1hcHBpbmdzID09IG51bGwpIHsKLQkJCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCSgoSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yKXRoaXMuY29udGVudEFzc2lzdFByb2Nlc3Nvcikuc2V0UGFja2FnZUZyYWdtZW50Um9vdChyb290KTsKLQkJfQotCQkKLQkJU3RyaW5nIHBhY2thZ2VfID0gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRQYWNrYWdlKCk7Ci0JCQotCQlpZiAocGFja2FnZV8gPT0gbnVsbCkgewotCQkJc2V0VGV4dERhdGEoIiIpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0VGV4dERhdGEocGFja2FnZV8pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9ICgoWG1sRU9iamVjdCkgdGhpcy5lbnRpdHlNYXBwaW5ncykuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcm9vdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGV4dERhdGEoU3RyaW5nIHRleHREYXRhKSB7Ci0JCWlmICghIHRleHREYXRhLmVxdWFscyh0ZXh0LmdldFRleHQoKSkpIHsKLQkJCXRleHQuc2V0VGV4dCh0ZXh0RGF0YSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBPcGVucyBhIHNlbGVjdGlvbiBkaWFsb2cgdGhhdCBhbGxvd3MgdG8gc2VsZWN0IGEgcGFja2FnZS4gCi0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRoZSBzZWxlY3RlZCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2FuY2VsZWQuCi0JICogVGhlIGNhbGxlciB0eXBpY2FsbHkgc2V0cyB0aGUgcmVzdWx0IHRvIHRoZSBwYWNrYWdlIGlucHV0IGZpZWxkLgotCSAqIDxwPgotCSAqIENsaWVudHMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgd2FudCB0byBvZmZlciBhIGRpZmZlcmVudCBkaWFsb2cuCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBjaG9vc2VQYWNrYWdlKCkgewkJCi0JCVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2c7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlUGFja2FnZURpYWxvZyh0ZXh0LmdldFNoZWxsKCksIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRVaVBsdWdpbi5sb2coZSk7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlYbWxNZXNzYWdlcy5YbWxQYWNrYWdlQ2hvb3Nlcl9QYWNrYWdlRGlhbG9nX3RpdGxlKTsgCi0JCXNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdFVpWG1sTWVzc2FnZXMuWG1sUGFja2FnZUNob29zZXJfUGFja2FnZURpYWxvZ19tZXNzYWdlKTsgCi0JCXNlbGVjdGlvbkRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrPSBnZXRQYWNrYWdlRnJhZ21lbnQoKTsKLQkJaWYgKHBhY2sgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uRGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb25zKG5ldyBPYmplY3RbXSB7IHBhY2sgfSk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgc2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBpbnB1dC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcGFja2FnZSBmcmFnbWVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgCi0JICogY291bGQgbm90IGJlIHJlc29sdmVkLgotCSAqLwotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJU3RyaW5nIHBhY2thZ2VTdHJpbmcgPSB0aGlzLnRleHQuZ2V0VGV4dCgpOwotCQlyZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlU3RyaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQwZjU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlCi0JZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgCi17Ci0JcHJpdmF0ZSBYbWxKYXZhQXR0cmlidXRlQ2hvb3NlciBqYXZhQXR0cmlidXRlQ2hvb3NlcjsKLQkKLQlwcml2YXRlIEFkYXB0ZXIgcGVyc2lzdGVudFR5cGVMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTsKLQkKLQlwdWJsaWMgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJYnVpbGRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFBlcnNpc3RlbnRUeXBlTGlzdGVuZXIoKSB7Ci0JCXRoaXMucGVyc2lzdGVudFR5cGVMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcGVyc2lzdGVudFR5cGVDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgcGVyc2lzdGVudFR5cGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoWG1sUGVyc2lzdGVudFR5cGUuY2xhc3MpID09IAotCQkJT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOVF9UWVBFX19TUEVDSUZJRURfQVRUUklCVVRFX01BUFBJTkdTKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl1cGRhdGVFbmJhYmxlZFN0YXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkSmF2YUF0dHJpYnV0ZU5hbWVMYWJlbChjb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLmphdmFBdHRyaWJ1dGVDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEphdmFBdHRyaWJ1dGVDaG9vc2VyKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5qYXZhQXR0cmlidXRlQ2hvb3Nlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJCi0JCWJ1aWxkTWFwcGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0JCQotCQlDQ29tYm9WaWV3ZXIgbWFwcGluZ0NvbWJvID0gYnVpbGRNYXBwaW5nQ29tYm8oY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCVBhZ2VCb29rIGJvb2sgPSBidWlsZE1hcHBpbmdQYWdlQm9vayhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJYm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlzdXBlci5lbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldEF0dHJpYnV0ZSgpICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVudFR5cGUgPSBnZXRBdHRyaWJ1dGUoKS50eXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl0aGlzLnBlcnNpc3RlbnRUeXBlLmVBZGFwdGVycygpLmFkZCh0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy5wZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5wZXJzaXN0ZW50VHlwZUxpc3RlbmVyKTsKLQkJCXRoaXMucGVyc2lzdGVudFR5cGUgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc2VuZ2FnZUxpc3RlbmVycygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKElKcGFDb250ZW50Tm9kZSBwZXJzaXN0ZW50QXR0cmlidXRlTm9kZSkgewotCQlzdXBlci5kb1BvcHVsYXRlKHBlcnNpc3RlbnRBdHRyaWJ1dGVOb2RlKTsKLQkJaWYgKHBlcnNpc3RlbnRBdHRyaWJ1dGVOb2RlID09IG51bGwpIHsKLQkJCXRoaXMuamF2YUF0dHJpYnV0ZUNob29zZXIucG9wdWxhdGUobnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAoKFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBlcnNpc3RlbnRBdHRyaWJ1dGVOb2RlKS5nZXRNYXBwaW5nKCk7Ci0JCQl0aGlzLmphdmFBdHRyaWJ1dGVDaG9vc2VyLnBvcHVsYXRlKG1hcHBpbmcpOwotCQkJdXBkYXRlRW5iYWJsZWRTdGF0ZSgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdGhpcy5qYXZhQXR0cmlidXRlQ2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl1cGRhdGVFbmJhYmxlZFN0YXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZUNob29zZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVuYmFibGVkU3RhdGUoKSB7Ci0JCWlmIChnZXRBdHRyaWJ1dGUoKSA9PSBudWxsIHx8IGdldEF0dHJpYnV0ZSgpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBlbmFibGVkID0gISgoWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSkgZ2V0QXR0cmlidXRlKCkpLmlzVmlydHVhbCgpOwotCQl1cGRhdGVFbmFibGVkU3RhdGUoZW5hYmxlZCwgZ2V0Q29udHJvbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKGJvb2xlYW4gZW5hYmxlZCwgQ29udHJvbCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCWZvciAoSXRlcmF0b3I8Q29udHJvbD4gaSA9IG5ldyBBcnJheUl0ZXJhdG9yPENvbnRyb2w+KCgoQ29tcG9zaXRlKSBjb250cm9sKS5nZXRDaGlsZHJlbigpKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCXVwZGF0ZUVuYWJsZWRTdGF0ZShlbmFibGVkLCBpLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JLy9UT0RPIE5vdCByZWFsbHkgaG93IEkgd291bGQgd2FudCB0byBpbXBsZW1lbnQgdGhpcywgYnV0IGl0IGlzIGxvdyByaXNrIGZpeCBmb3IgYnVnIDE5MjAzNSBmb3IgMS4wUkMzCi0JcHJvdGVjdGVkIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcltdIHVpUHJvdmlkZXJzRm9yKElQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpLnRvQXJyYXkobmV3IElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlclthdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKS5zaXplKCldKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjE1NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlhtbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSVR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVtYmVkZGFibGVVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuRW50aXR5VWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLkpwdFVpWG1sTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21ib1ZpZXdlci5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFhtbFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIAotewotCXByaXZhdGUgWG1sSmF2YUNsYXNzQ2hvb3NlciBqYXZhQ2xhc3NDaG9vc2VyOwotCQotCXByaXZhdGUgTWV0YURhdGFDb21wbGV0ZUNvbWJvVmlld2VyIG1ldGFkYXRhQ29tcGxldGVDb21ib1ZpZXdlcjsKLQkKLQlwcml2YXRlIEFjY2Vzc1R5cGVDb21ib1ZpZXdlciBhY2Nlc3NDb21ib1ZpZXdlcjsKLQkKLQlwdWJsaWMgWG1sUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElUeXBlTWFwcGluZ1VpUHJvdmlkZXI+IGJ1aWxkVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJQ29sbGVjdGlvbjxJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPigpOwotCQl0eXBlTWFwcGluZ1VpUHJvdmlkZXJzLmFkZChuZXcgRW50aXR5VWlQcm92aWRlcigpKTsKLQkJdHlwZU1hcHBpbmdVaVByb3ZpZGVycy5hZGQobmV3IE1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyKCkpOwkJCQotCQl0eXBlTWFwcGluZ1VpUHJvdmlkZXJzLmFkZChuZXcgRW1iZWRkYWJsZVVpUHJvdmlkZXIoKSk7CQkJCi0JCXJldHVybiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkSmF2YUNsYXNzTGFiZWwoY29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJdGhpcy5qYXZhQ2xhc3NDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEphdmFDbGFzc0Nob29zZXIoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmphdmFDbGFzc0Nob29zZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJYnVpbGRUeXBlTWFwcGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0JCQotCQlDQ29tYm9WaWV3ZXIgdHlwZU1hcHBpbmdDb21ibyA9IGJ1aWxkVHlwZU1hcHBpbmdDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXR5cGVNYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCWJ1aWxkTWV0YWRhdGFDb21wbGV0ZUxhYmVsKGNvbXBvc2l0ZSk7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZUNvbWJvVmlld2VyID0gbmV3IE1ldGFEYXRhQ29tcGxldGVDb21ib1ZpZXdlcihjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRBY2Nlc3NMYWJlbChjb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkQWNjZXNzVHlwZUNvbWJvVmlld2VyKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJUGFnZUJvb2sgdHlwZU1hcHBpbmdQYWdlQm9vayA9IGJ1aWxkVHlwZU1hcHBpbmdQYWdlQm9vayhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdHlwZU1hcHBpbmdQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCQotCXByaXZhdGUgTGFiZWwgYnVpbGRNZXRhZGF0YUNvbXBsZXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCApIHsKLQkJcmV0dXJuIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpWG1sTWVzc2FnZXMuUGVyc2lzdGVudFR5cGVQYWdlX01ldGFkYXRhQ29tcGxldGVMYWJlbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoSUpwYUNvbnRlbnROb2RlIHBlcnNpc3RlbnRUeXBlTm9kZSkgewotCQlzdXBlci5kb1BvcHVsYXRlKHBlcnNpc3RlbnRUeXBlTm9kZSk7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZU5vZGUgPT0gbnVsbCkgewotCQkJdGhpcy5qYXZhQ2xhc3NDaG9vc2VyLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBNeUFjY2Vzc0hvbGRlcihudWxsKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlYbWxUeXBlTWFwcGluZyBtYXBwaW5nID0gKChYbWxQZXJzaXN0ZW50VHlwZSkgcGVyc2lzdGVudFR5cGVOb2RlKS5nZXRNYXBwaW5nKCk7Ci0JCQl0aGlzLmphdmFDbGFzc0Nob29zZXIucG9wdWxhdGUobWFwcGluZyk7Ci0JCQl0aGlzLm1ldGFkYXRhQ29tcGxldGVDb21ib1ZpZXdlci5wb3B1bGF0ZShtYXBwaW5nKTsKLQkJCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIucG9wdWxhdGUobmV3IE15QWNjZXNzSG9sZGVyKG1hcHBpbmcpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXRoaXMuamF2YUNsYXNzQ2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGVDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5qYXZhQ2xhc3NDaG9vc2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkJCi0JcHJpdmF0ZSBjbGFzcyBNeUFjY2Vzc0hvbGRlciBleHRlbmRzIFhtbEVPYmplY3QgaW1wbGVtZW50cyBBY2Nlc3NIb2xkZXJ7Ci0JCQotCQlwcml2YXRlIFhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nOwotCQlNeUFjY2Vzc0hvbGRlcihYbWxUeXBlTWFwcGluZyB4bWxUeXBlTWFwcGluZykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMueG1sVHlwZU1hcHBpbmcgPSB4bWxUeXBlTWFwcGluZzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7Ci0JCQl4bWxUeXBlTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3MoYWNjZXNzVHlwZSk7Ci0JCX0KLQkKLQkJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQkJcmV0dXJuIHhtbFR5cGVNYXBwaW5nLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIFhtbFR5cGVNYXBwaW5nLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBPcm1QYWNrYWdlLlhNTF9UWVBFX01BUFBJTkdfX1NQRUNJRklFRF9BQ0NFU1M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy54bWxUeXBlTWFwcGluZzsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9FbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9FbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE2NjRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvRW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nc0ludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NJbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCAKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChPcm1QYWNrYWdlLkxpdGVyYWxzLkVOVElUWV9NQVBQSU5HU19JTlRFUk5BTF9fUEVSU0lTVEVOVF9UWVBFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkVOVElUWV9NQVBQSU5HUyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8KLQkJcmV0dXJuICJFbnRpdHlNYXBwaW5ncyI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFbnRpdHlNYXBwaW5nc0ludGVybmFsLmNsYXNzKSkgewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9NQVBQSU5HU19JTlRFUk5BTF9fUEVSU0lTVEVOVF9UWVBFUzoKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTUFQUElOR1NfSU5URVJOQUxfX1RZUEVfTUFQUElOR1M6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZCgKLQkJCQluZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQlub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL0pwYUNvcmVYbWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9KcGFDb3JlWG1sSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5YzBmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL0pwYUNvcmVYbWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLnV0aWwuT3JtQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSURpc3Bvc2FibGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLgotICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uCi0gKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgSnBhQ29yZVhtbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IAotCWV4dGVuZHMgT3JtQWRhcHRlckZhY3RvcnkgCi0JaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LAotCQlJQ2hhbmdlTm90aWZpZXIsIAotCQlJRGlzcG9zYWJsZSAKLXsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBKcGFDb3JlWG1sSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBYbWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXIgeG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyOwotCQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhtbFJvb3RDb250ZW50Tm9kZUFkYXB0ZXIoKSB7Ci0JCWlmICh4bWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJeG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyID0gbmV3IFhtbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB4bWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlciBlbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nc0ltcGx9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVudGl0eU1hcHBpbmdzQWRhcHRlcigpIHsKLQkJaWYgKGVudGl0eU1hcHBpbmdzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVudGl0eU1hcHBpbmdzSXRlbVByb3ZpZGVyID0gbmV3IEVudGl0eU1hcHBpbmdzSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVudGl0eU1hcHBpbmdzSXRlbVByb3ZpZGVyOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRUeXBlfSBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyIHhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyOwotCQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50VHlwZX0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlWG1sUGVyc2lzdGVudFR5cGVBZGFwdGVyKCkgewotCQlpZiAoeG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJeG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgWG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0JCQotCQlyZXR1cm4geG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudEF0dHJpYnV0ZX0gaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyIHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXI7Ci0JCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlpZiAoeG1sUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl4bWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyID0gbmV3IFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0JCQotCQlyZXR1cm4geG1sUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeSgKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKQotCQkJCQl8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh4bWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXhtbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChlbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoeG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9YbWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZjQyNjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9YbWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JbWFnZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotcHVibGljIGNsYXNzIFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCAKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKChYbWxQZXJzaXN0ZW50QXR0cmlidXRlKSBvYmplY3QpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUltYWdlIGltYWdlOwotCQlpZiAobWFwcGluZyBpbnN0YW5jZW9mIElCYXNpYykgewotCQkJaW1hZ2UgPSBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuQkFTSUMpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJSWQpIHsKLQkJCWltYWdlID0gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLklEKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSVZlcnNpb24pIHsKLQkJCWltYWdlID0gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLlZFUlNJT04pOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJRW1iZWRkZWQpIHsKLQkJCWltYWdlID0gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkVNQkVEREVEKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUVtYmVkZGVkSWQpIHsKLQkJCWltYWdlID0gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkVNQkVEREVEX0lEKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU9uZVRvT25lKSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5PTkVfVE9fT05FKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU9uZVRvTWFueSkgewotCQkJaW1hZ2UgPSBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuT05FX1RPX01BTlkpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJTWFueVRvT25lKSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5NQU5ZX1RPX09ORSk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElNYW55VG9NYW55KSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5NQU5ZX1RPX01BTlkpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJVHJhbnNpZW50KSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5UUkFOU0lFTlQpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2UgPSBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTlVMTF9BVFRSSUJVVEVfTUFQUElORyk7Ci0JCX0KLQkJCi0JCS8vIGFwcGx5ICJnaG9zdGluZyIKLQkJaWYgKG1hcHBpbmcuaXNWaXJ0dWFsKCkpIHsKLQkJCUNvbG9yIG9mZndoaXRlID0gbmV3IENvbG9yKGltYWdlLmdldERldmljZSgpLCAyNTAsIDI1MCwgMjUwKTsKLQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBJbWFnZVV0aWxpdGllcy5jcmVhdGVTaGFkZWRJbWFnZShpbWFnZSwgb2Zmd2hpdGUpOwotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoaW1hZ2UuZ2V0RGV2aWNlKCksIGltYWdlRGF0YSk7Ci0JCX0KLQkJCi0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChYbWxQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzKSkgewotCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTlRfQVRUUklCVVRFX19NQVBQSU5HOgotCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTlRfQVRUUklCVVRFX19OQU1FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9YbWxQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9YbWxQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODc3NTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYUNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc0ltYWdlczsKLQotcHVibGljIGNsYXNzIFhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIAotCQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCAKLQkJCUlJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBYbWxQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QRVJTSVNURU5UX1RZUEVfX1NQRUNJRklFRF9QRVJTSVNURU5UX0FUVFJJQlVURVMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUEVSU0lTVEVOVF9UWVBFX19WSVJUVUFMX1BFUlNJU1RFTlRfQVRUUklCVVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlJVHlwZU1hcHBpbmcgbWFwcGluZyA9ICgoSVBlcnNpc3RlbnRUeXBlKSBvYmplY3QpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUVudGl0eSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTlRJVFkpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJRW1iZWRkYWJsZSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTUJFRERBQkxFKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoWG1sUGVyc2lzdGVudFR5cGUpIG9iamVjdCkuZ2V0Q2xhc3NfKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChYbWxQZXJzaXN0ZW50VHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZVBhY2thZ2UuSVBFUlNJU1RFTlRfVFlQRV9fTUFQUElOR19LRVk6Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTlRfVFlQRV9fQ0xBU1M6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQoCi0JCQkJCW5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQlub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJCQotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5UX1RZUEVfX1NQRUNJRklFRF9QRVJTSVNURU5UX0FUVFJJQlVURVM6Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTlRfVFlQRV9fVklSVFVBTF9QRVJTSVNURU5UX0FUVFJJQlVURVM6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQoCi0JCQkJCW5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQlub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjljN2M4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLQotcHVibGljIGNsYXNzIFhtbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCAKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgWG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1JPT1RfQ09OVEVOVF9OT0RFX19FTlRJVFlfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRW50aXR5TWFwcGluZ3MuY2xhc3MpKSB7Ci0JCWNhc2UgT3JtUGFja2FnZS5YTUxfUk9PVF9DT05URU5UX05PREVfX0VOVElUWV9NQVBQSU5HUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKAotCQkJCW5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCW5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sU3RydWN0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZGRkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnN0cnVjdHVyZS5JSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBYbWxTdHJ1Y3R1cmVQcm92aWRlciBpbXBsZW1lbnRzIElKcGFTdHJ1Y3R1cmVQcm92aWRlciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGZpbGVDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIEpwdENvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBidWlsZENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihuZXcgSnBhQ29yZVhtbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihuZXcgSnBhQ29yZVhtbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzRlNDcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzOTVhOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2MzhiNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDoyMCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNjYwNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1ODozMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjFkOGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gb3JnLmp1bml0Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpkdHV0aWxpdHk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3M2JkYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmMTFmNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlID0gMS41Ci1qYXZhY1RhcmdldCA9IDEuNQotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViZjhkYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0jICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0jICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSMgIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0Q29yZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdENvcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY1MTUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0Q29yZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnB0Q29yZUNvbnRlbnRKYXZhTWFwcGluZ3NUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qZHR1dGlsaXR5LkpwdENvcmVKZHRVdGlsaXR5VGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwubW9kZWwuSnB0Q29yZU1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm0uSnB0Q29yZVBsYXRmb3JtVGVzdHM7Ci0KLS8qKgotICogUnVucyBhbGwgSlBUIENvcmUgVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdENvcmVUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0Q29yZUNvbnRlbnRKYXZhTWFwcGluZ3NUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlSmR0VXRpbGl0eVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVQbGF0Zm9ybVRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29yZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvUHJvamVjdFV0aWxpdHkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvUHJvamVjdFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5ZTc4YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL1Byb2plY3RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RVdGlsaXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsUHJvamVjdHMoKSB7Ci0gICAgCUlQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbMF07Ci0gICAgCXRyeSB7Ci0gICAgICAgIHByb2plY3RzID0gIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4KSB7Ci0gICAgCQkvLyBDYXRjaCBNYWxmb3JtZWQgdHJlZSBleGNlcHRpb24gdGhhdCBvY2N1cnMgZnJvbSB0aW1lIHRvIHRpbWUuLi4KLSAgICAJfQotICAgIAlyZXR1cm4gcHJvamVjdHM7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2Nsb3NpbmcgcHJvamVjdHMgYW5kIHRyZWFkIHdvcmsgaW4gaGVyZSBpcyBhIGhhY2sgYmVjYXVzZSBvZiBhIEJlYW5JbmZvIGJ1ZyBob2xkaW5nCi0gICAgICAgIC8vb250byBqYXJzIGxvYWRlZCBpbiBhbm90aGVyIFZNCi0gICAgICAgIAotLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgaWYgKHByb2plY3RzW2ldLmV4aXN0cygpKSB7Ci0vLyAgICAgICAgICAgICAgICBwcm9qZWN0c1tpXS5jbG9zZShudWxsKTsgLy8gVGhpcyBzaG91bGQgc2lnbmFsIHRoZSBleHRyYSBWTSB0byBraWxsIGl0c2VsZgotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotIC8vICAgICAgIFRocmVhZC55aWVsZCgpOyAvLyBnaXZlIHRoZSBWTSBhIGNoYW5jZSB0byBkaWUKLSAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCQkJRXhjZXB0aW9uIGxhc3RFeGNlcHRpb24gPSBudWxsOwotCQkJCQkvLyBEb24ndCBtYWtlIDJeMTIgaXMgYWJvdXQgNCBzZWNvbmRzIHdoaWNoIGlzIHRoZSBtYXggd2UKLQkJCQkJLy8gd2lsbCB3YWl0IGZvciB0aGUgVk0gdG8gZGllCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMTMgJiYgIXN1Y2Nlc3M7IGorKykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWxhc3RFeGNlcHRpb24gPSBlOwotCQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlwcm9qZWN0LmNsb3NlKG51bGwpOwotCQkJCQkJCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoKGludCkgTWF0aC5wb3coMiwgaikpOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCQl9IC8vIGlmIHRoZSBWTSBpc24ndCBkZWFkLCB0cnkgc2xlZXBpbmcKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXN1Y2Nlc3MgJiYgbGFzdEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkvL0xvZ2dlci5nZXRMb2dnZXIoKS5sb2coIlByb2JsZW0gd2hpbGUgZGVsZXRpbmc6ICIgKyBsYXN0RXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0vLwkJCQkJCSBBc3NlcnQuZmFpbCgiQ2F1Z2h0IEV4Y2VwdGlvbj0iICsKLS8vCQkJCQkJIGxhc3RFeGNlcHRpb24uZ2V0TWVzc2FnZSgpICsgIiB3aGVuIGRlbGV0aW5nIHByb2plY3Q9IiArIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLSAgICAgICAgLy92ZXJpZnlOb1Byb2plY3RzKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjdhOTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgSnBhSmF2YVRlc3RDYXNlIHsKLQotCXB1YmxpYyBKYXZhRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHkxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3luY2hQZXJzaXN0ZW5jZVhtbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eTEoKTsKLQkJSUphdmFUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlTmFtZWQoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB0eXBlTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotLy8gVE9ETyB3ZSBjYW4gb25seSBleGVjdXRlIDEgdGVzdCBmb3Igbm93Li4uCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0S2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5jcmVhdGVUZXN0RW50aXR5MSgpOwotLy8JCUlKYXZhVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZU5hbWVkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnRFcXVhbHMoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCB0eXBlTWFwcGluZy5nZXRLZXkoKSk7Ci0vLwl9Ci0vLwotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSnBhSmF2YVRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KcGFKYXZhVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwMjhlOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KcGFKYXZhVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSnBhQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5zeW5jaC5TeW5jaHJvbml6ZUNsYXNzZXNKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuamR0dXRpbGl0eS5Bbm5vdGF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFKYXZhVGVzdENhc2UgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIEpwYUphdmFUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoVGVzdEpwYVByb2plY3QpIHRoaXMuamF2YVByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGVOYW1lZChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJZm9yIChJSnBhRmlsZSBqcGFGaWxlIDogdGhpcy5qcGFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmpwYUZpbGVzKEphdmFDb3JlLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCUpwYUNvbXBpbGF0aW9uVW5pdCBjdSA9IChKcGFDb21waWxhdGlvblVuaXQpIGpwYUZpbGUuZ2V0Q29udGVudCgpOwotCQkJZm9yIChKYXZhUGVyc2lzdGVudFR5cGUgcHQgOiBjdS5nZXRUeXBlcygpKSB7Ci0JCQkJaWYgKHB0LmZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKS5lcXVhbHModHlwZU5hbWUpKSB7Ci0JCQkJCXJldHVybiBwdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWlzc2luZyB0eXBlOiAiICsgdHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBUeXBlIHR5cGVOYW1lZChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlTmFtZWQodHlwZU5hbWUpLmdldFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaFBlcnNpc3RlbmNlWG1sKCkgewotCQlTeW5jaHJvbml6ZUNsYXNzZXNKb2Igam9iID0gbmV3IFN5bmNocm9uaXplQ2xhc3Nlc0pvYih0aGlzLmpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RmlsZSgic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKTsKLQkJQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKGpvYiwgInJ1biIsIElQcm9ncmVzc01vbml0b3IuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSnB0Q29yZUNvbnRlbnRKYXZhTWFwcGluZ3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSnB0Q29yZUNvbnRlbnRKYXZhTWFwcGluZ3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJiNmJkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0pwdENvcmVDb250ZW50SmF2YU1hcHBpbmdzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVDb250ZW50SmF2YU1hcHBpbmdzVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvcmVDb250ZW50SmF2YU1hcHBpbmdzVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0Q29yZUNvbnRlbnRKYXZhTWFwcGluZ3NUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDYxNjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuamR0dXRpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWV0aG9kQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotCi0vKioKLSAqIFByb3ZpZGUgYW4gZWFzeSg/KSB3YXkgdG8gYnVpbGQgYW4gYW5ub3RhdGVkIHNvdXJjZSBmaWxlLgotICogVGhlIHR5cGUgbXVzdCBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgb25lIG9mIHRoZSAjY3JlYXRlVHlwZSgpIG1ldGhvZHMKLSAqIGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUgdmFyaW91cyBoZWxwZXIgbWV0aG9kcyAoaS5lLiB0aGUgdHlwZSBpcyAqbm90KgotICogY3JlYXRlZCBkdXJpbmcgI3NldFVwKCkpLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvblRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiQW5ub3RhdGlvblRlc3RQcm9qZWN0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAidGVzdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFRZUEVfTkFNRTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUUgPSBUWVBFX05BTUUgKyAiLmphdmEiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotCi0KLQkvLyAqKioqKioqKioqIFRlc3RDYXNlIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IHRoaXMuYnVpbGRKYXZhUHJvamVjdChQUk9KRUNUX05BTUUsIGZhbHNlKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SmF2YVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7ICAvLyBmYWxzZSA9IG5vIGF1dG8tYnVpbGQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuZHVtcFNvdXJjZSgpOwotCQl0aGlzLmphdmFQcm9qZWN0LmRpc3Bvc2UoKTsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgdGhpcy5nZXROYW1lKCkgKyAiICoqKioiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuc291cmNlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSBjcmVhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBjcmVhdGUgYW4gdW4tYW5ub3RhdGVkIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgY3JlYXRlVGVzdFR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBzaG9ydGN1dCBmb3Igc2ltcGx5IGFkZGluZyBhbiBhbm5vdGF0aW9uIHRvIHRoZSAnaWQnIGZpZWxkCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGNyZWF0ZVRlc3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uSW1wb3J0LCBmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiAoYW5ub3RhdGlvbkltcG9ydCA9PSBudWxsKSA/Ci0JCQkJCUVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpCi0JCQkJOgotCQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4oYW5ub3RhdGlvbkltcG9ydCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKGlkRmllbGRBbm5vdGF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogc2hvcnRjdXQgZm9yIHNpbXBseSBhZGRpbmcgYSBmdWxseS1xdWFsaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgJ2lkJyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBjcmVhdGVUZXN0VHlwZShmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobnVsbCwgaWRGaWVsZEFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBjcmVhdGVUZXN0VHlwZShBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlVHlwZShQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgdGhpcy5jcmVhdGVTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlcikpOwotCX0KLQotCXByb3RlY3RlZCBTb3VyY2VXcml0ZXIgY3JlYXRlU291cmNlV3JpdGVyKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWZmZXIgc2IsIEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgewotCQlzYi5hcHBlbmQoQ1IpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gYW5ub3RhdGlvbldyaXRlci5pbXBvcnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQlzYi5hcHBlbmQoc3RyZWFtLm5leHQoKSk7Ci0JCQlzYi5hcHBlbmQoIjsiKTsKLQkJCXNiLmFwcGVuZChDUik7Ci0JCX0KLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRUeXBlQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBnZXRJZCgpIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldFRlc3RGaWVsZChTdHJpbmcgdGVzdEZpZWxkKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMudGVzdEZpZWxkID0gdGVzdEZpZWxkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJVHlwZSBqZHRUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmZpbmRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBUeXBlIHRlc3RUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVHlwZSh0aGlzLmpkdFR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpZWxkQXR0cmlidXRlIGlkRmllbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZmllbGROYW1lZCgiaWQiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmllbGRBdHRyaWJ1dGUgbmFtZUZpZWxkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZWQoIm5hbWUiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmllbGRBdHRyaWJ1dGUgZmllbGROYW1lZChTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWVsZEF0dHJpYnV0ZSh0aGlzLmpkdFR5cGUoKS5nZXRGaWVsZChmaWVsZE5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQXR0cmlidXRlIGlkR2V0TWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLm1ldGhvZE5hbWVkKCJnZXRJZCIpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RBdHRyaWJ1dGUgbmFtZUdldE1ldGhvZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5tZXRob2ROYW1lZCgiZ2V0TmFtZSIpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RBdHRyaWJ1dGUgbWV0aG9kTmFtZWQoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5tZXRob2QobWV0aG9kTmFtZSwgRU1QVFlfU1RSSU5HX0FSUkFZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQXR0cmlidXRlIG1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IE1ldGhvZEF0dHJpYnV0ZSh0aGlzLmpkdFR5cGUoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZVNpZ25hdHVyZXMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qZHRUeXBlKCkuZ2V0T3BlbmFibGUoKS5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0IHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U291cmNlQ29udGFpbnMoU3RyaW5nIHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmcgc291cmNlID0gdGhpcy5zb3VyY2UoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IHNvdXJjZS5pbmRleE9mKHMpID4gLTE7Ci0JCWlmICggISBmb3VuZCkgewotCQkJU3RyaW5nIG1zZyA9ICJzb3VyY2UgZG9lcyBub3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgc3RyaW5nOiAiICsgcyArICIgKHNlZSBTeXN0ZW0gY29uc29sZSkiOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIHRoaXMuZ2V0TmFtZSgpICsgIiAqKioqIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2UpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlmYWlsKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihTdHJpbmcgcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLnNvdXJjZSgpOwotCQlpbnQgcG9zID0gc291cmNlLmluZGV4T2Yocyk7Ci0JCWlmIChwb3MgIT0gLTEpIHsKLQkJCVN0cmluZyBtc2cgPSAidW5leHBlY3RlZCBzdHJpbmcgaW4gc291cmNlIChwb3NpdGlvbjogIiArIHBvcyArICIpOiAiICsgcyArICIgKHNlZSBTeXN0ZW0gY29uc29sZSkiOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIHRoaXMuZ2V0TmFtZSgpICsgIiAqKioqIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2UpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlmYWlsKG1zZyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFuaXB1bGF0ZSBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICpmaXJzdCogbWVtYmVyIHZhbHVlIHBhaXIgZm9yIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlmb3IgKE1lbWJlclZhbHVlUGFpciBwYWlyIDogdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikpIHsKLQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHBhaXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMoTm9ybWFsQW5ub3RhdGlvbiBuYSkgewotCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgZm9yIG51bGwgbWVtYmVyIHZhbHVlIHBhaXIKLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiB2YWx1ZUludGVybmFsKE1lbWJlclZhbHVlUGFpciBwYWlyKSB7Ci0JCXJldHVybiAocGFpciA9PSBudWxsKSA/IG51bGwgOiBwYWlyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGFubm90YXRpb25FbGVtZW50VmFsdWUoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVJbnRlcm5hbCh0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBhbm5vdGF0aW9uRWxlbWVudFZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZS5lcXVhbHMoInZhbHVlIikgPyBhbm5vdGF0aW9uLmdldFZhbHVlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKiAoQW4gZWxlbWVudCBuYW1lIG9mICJ2YWx1ZSIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlCi0JICogbWVtYmVyIGFubm90YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGFubm90YXRpb25FbGVtZW50VmFsdWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbnVtYmVyIGxpdGVyYWwgYW5kIHNldCBpdHMgaW5pdGlhbCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGxpdGVyYWwuCi0JICovCi0JcHJvdGVjdGVkIE51bWJlckxpdGVyYWwgbmV3TnVtYmVyTGl0ZXJhbChBU1QgYXN0LCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIGFzdC5uZXdOdW1iZXJMaXRlcmFsKEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIHN0cmluZyBsaXRlcmFsIGFuZCBzZXQgaXRzIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0xpdGVyYWwgbmV3U3RyaW5nTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUodmFsdWUpOwotCQlyZXR1cm4gc3RyaW5nTGl0ZXJhbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTaW1wbGVOYW1lIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShuYW1lKTsKLQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiBwYWlyOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhc3QsIGFzdC5uZXdTaW1wbGVOYW1lKG5hbWUpLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCB0aGlzLm5ld1N0cmluZ0xpdGVyYWwoYXN0LCB2YWx1ZSkpOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgdGhpcy5uZXdOdW1iZXJMaXRlcmFsKGFzdCwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIgcGFpcikgewotCQl0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKS5hZGQocGFpcik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksIG5hbWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgbmFtZSwgdmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uV3JpdGVyIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCk7Ci0JCXZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpOwotCQl2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKTsKLQkJdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKTsKLQkJdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpOwotCQl2b2lkIGFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1ZmZlciBzYik7Ci0JCXZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpOwotCQl2b2lkIGFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyIGltcGxlbWVudHMgQW5ub3RhdGlvbldyaXRlciB7Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7cmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1ZmZlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uV3JpdGVyV3JhcHBlciBpbXBsZW1lbnRzIEFubm90YXRpb25Xcml0ZXIgewotCQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25Xcml0ZXIgYXc7Ci0JCXB1YmxpYyBBbm5vdGF0aW9uV3JpdGVyV3JhcHBlcihBbm5vdGF0aW9uV3JpdGVyIGF3KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5hdyA9IGF3OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7cmV0dXJuIGF3LmltcG9ydHMoKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7YXcuYXBwZW5kVHlwZUFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1ZmZlciBzYikge2F3LmFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1ZmZlciBzYikge2F3LmFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpIHthdy5hcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpIHthdy5hcHBlbmRTZXRJZE1ldGhvZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1ZmZlciBzYikge2F3LmFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWZmZXIgc2IpIHthdy5hcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKHNiKTt9Ci0JfQotCi0JcHVibGljIGNsYXNzIEFubm90YXRlZFNvdXJjZVdyaXRlciBpbXBsZW1lbnRzIFNvdXJjZVdyaXRlciB7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyOwotCQlwdWJsaWMgQW5ub3RhdGVkU291cmNlV3JpdGVyKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYW5ub3RhdGlvbldyaXRlciA9IGFubm90YXRpb25Xcml0ZXI7Ci0JCX0KLQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCQlBbm5vdGF0aW9uVGVzdENhc2UudGhpcy5hcHBlbmRTb3VyY2VUbyhzYiwgdGhpcy5hbm5vdGF0aW9uV3JpdGVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGEyNTljLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpkdHV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5NZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZVR5cGUoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCQlTdHJpbmcgdmFsdWUgPSAoKFN0cmluZ0xpdGVyYWwpICgoTWVtYmVyVmFsdWVQYWlyKSAoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24pLnZhbHVlcygpLmdldCgwKSkuZ2V0VmFsdWUoKSkuZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19JRDIiLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Kb2luQ29sdW1uIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKLQkJU3RyaW5nIHZhbHVlID0gKChTdHJpbmdMaXRlcmFsKSAoKE1lbWJlclZhbHVlUGFpcikgKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS52YWx1ZXMoKS5nZXQoMCkpLmdldFZhbHVlKCkpLmdldExpdGVyYWxWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfSUQyIiwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkFERFJFU1NfSUQyIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJBRERSRVNTX0lEMiIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJTdHJpbmcgY29tbWVudCgpOyBKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29tbWVudD1cInRlc3RcIixjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29tbWVudD1cInRlc3RcIixjb2x1bW5zPUBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKG51bGwpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKG51bGwpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIil9KSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAzKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiSm9pbkNvbHVtbiIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnM9e0BKb2luQ29sdW1uLEBKb2luQ29sdW1ufSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4sIEBhbm5vdC5Kb2luQ29sdW1ufSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4sIEBhbm5vdC5Kb2luQ29sdW1uLCIgKyBDUiArICIgICAgQEpvaW5Db2x1bW59KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkpvaW5Db2x1bW4iKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiNzciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz1AYW5ub3QuSm9pbkNvbHVtbig3NykpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9QEpvaW5Db2x1bW4pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIjc3Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9QGFubm90LkpvaW5Db2x1bW4oNzcpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbig3NyksQEpvaW5Db2x1bW59KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zPXtASm9pbkNvbHVtbig3NyksQEpvaW5Db2x1bW59KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbig3NyksQGFubm90LkpvaW5Db2x1bW4oODgpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4oNzcpLEBKb2luQ29sdW1ufSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgdGV4dCgpOyBpbnQgbnVtKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKHRleHQ9XCJibGFoXCIsbnVtPTQyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zPXtASm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLCBudW09NDIpLEBKb2luQ29sdW1ufSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHRleHQoKTsgaW50IG51bSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLG51bT00MikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1ucyhjb2x1bW5zPXtASm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLCBudW09NDIpLG51bGwsQEpvaW5Db2x1bW59KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyB0ZXh0KCk7IGludCBudW0oKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKHRleHQ9XCJibGFoXCIsbnVtPTQyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBKb2luQ29sdW1ucyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLCBudW09NDIpLG51bGwsIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJASm9pbkNvbHVtbn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQzKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgbnVsbCwgbnVsbCwiOyAgLy8gdGhlIGxpbmUgZ2V0cyBzcGxpdAotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1ufSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgNCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgbnVsbCwgbnVsbCwiOyAgLy8gdGhlIGxpbmUgZ2V0cyBzcGxpdAotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1ufSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDQpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCxASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjJhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7bnVsbCxAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDEpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lENFwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoZXhwZWN0ZWQpOyAgLy8gdGhlIHNvdXJjZSBzaG91bGQgYmUgdW5jaGFuZ2VkCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuSm9pbkNvbHVtbnMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Kb2luQ29sdW1ucyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIik7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkpvaW5Db2x1bW5zIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L0pEVFRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9KRFRUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNmU2MDYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L0pEVFRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuamR0dXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKRFRUb29sc1Rlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBKRFRUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtQW5kTWVtYmVycyhTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlVHlwZSgiZW51bXMiLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVUeXBlKCJhbm5vdCIsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIgeyAiICsgYW5ub3RhdGlvbkJvZHkgKyAiIH0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW0xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1lbnVtcy5UZXN0RW51bS5CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZCgpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBKRFRUb29scy5yZXNvbHZlRW51bSgoTmFtZSkgZmllbGQuYW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKGRhZWEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5CQVoiLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0uQkFaIiwgIkBhbm5vdC5UZXN0QW5ub3RhdGlvbihmb289QkFaKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5UZXN0QW5ub3RhdGlvbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKLQkJRmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoKTsKLQotCQlTdHJpbmcgYWN0dWFsID0gSkRUVG9vbHMucmVzb2x2ZUVudW0oKE5hbWUpIGZpZWxkLmFubm90YXRpb25FbGVtZW50RXhwcmVzc2lvbihkYWVhKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW0zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtLioiLCAiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZCgpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBKRFRUb29scy5yZXNvbHZlRW51bSgoTmFtZSkgZmllbGQuYW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKGRhZWEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5CQVoiLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW51bTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJlbnVtcy5UZXN0RW51bSIsICJAYW5ub3QuVGVzdEFubm90YXRpb24oZm9vPVRlc3RFbnVtLkJBWikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuVGVzdEFubm90YXRpb24iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiZm9vIik7Ci0JCUZpZWxkQXR0cmlidXRlIGZpZWxkID0gdGhpcy5pZEZpZWxkKCk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IEpEVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBmaWVsZC5hbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oZGFlYSkpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvSnB0Q29yZUpkdFV0aWxpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L0pwdENvcmVKZHRVdGlsaXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhMGZiNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvSnB0Q29yZUpkdFV0aWxpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qZHR1dGlsaXR5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVKZHRVdGlsaXR5VGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvcmVKZHRVdGlsaXR5VGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKRFRUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUeXBlVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb3JlSmR0VXRpbGl0eVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwN2MzMTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qZHR1dGlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BU1ROb2RlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVUeXBlKCJhbm5vdCIsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIgeyAiICsgYW5ub3RhdGlvbkJvZHkgKyAiIH0iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW51bShTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlVHlwZSgiZW51bXMiLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygieHh4IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NDgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCI0OCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJjaGFyIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0nYycpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWZhbHNlKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImZhbHNlIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD1mYWxzZSkpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oZmFsc2UpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVOdWxsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZU51bGwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJTdHJpbmcgZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXopKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEzLCAiZnJlZCIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdDb25jYXRlbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInh4eHl5eXp6eiIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdDb25zdGFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQkvLyBqdXN0IGEgYml0IGhhY2t5OgotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PX0JBUiA9IFwieHh4XCI7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInh4eHl5eXp6eiIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVOdW1iZXJBcml0aG1ldGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTQ3IC0gNyArIDIgKiAxIC8gMSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoIjQyIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZU51bWJlclNoaWZ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTIgPDwgMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoIjgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlTnVtYmVyQ29uc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJLy8ganVzdCBhIGJpdCBoYWNreToKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPT19CQVIgPSA3NzsgQGFubm90LkZvbyhiYXI9Rk9PX0JBUikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoIjc3IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUNoYXJhY3RlckNvbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJjaGFyIGJhcigpOyIpOwotCQkvLyBqdXN0IGEgYml0IGhhY2t5OgotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZPT19CQVIgPSAnUSc7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQ2hhcmFjdGVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJRIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUNoYXJhY3RlckNhc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPShjaGFyKSAweDQxKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckNoYXJhY3RlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiQSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCb29sZWFuT3BlcmF0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj03ID4gMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUJvb2xlYW5PcGVyYXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTcgPT0gMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCb29sZWFuT3BlcmF0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSAmJiBmYWxzZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCb29sZWFuT3BlcmF0b3I0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSA/IGZhbHNlIDogdHJ1ZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9YmF6enp6KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWJhenp6eikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlSW52YWxpZFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJiYXp6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JDaGFyYWN0ZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJqYXZhLmxhbmcuT2JqZWN0XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9ZW51bXMuVGVzdEVudW0uY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWU3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyB2YWx1ZSA9ICJcImZhbHNlXCIiOwotCQlTdHJpbmcgZWxlbWVudCA9ICJmcmVkPSIgKyB2YWx1ZTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooIiArIGVsZW1lbnQgKyAiKSkpIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYTMsICJmcmVkIiwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17dHJ1ZSwgZmFsc2V9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHtudWxsLCBudWxsfSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWU5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NzcpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10ge251bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiXCJ4eHhcIiI7Ci0JCVN0cmluZyBlbGVtZW50ID0gImJhcj0iICsgdmFsdWU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oIiArIGVsZW1lbnQgKyAiKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQotCQlJVGV4dFJhbmdlIHRleHRSYW5nZSA9IG5ldyBBU1ROb2RlVGV4dFJhbmdlKGFlYS5hc3ROb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UoKS5pbmRleE9mKHZhbHVlKSwgdGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHZhbHVlLmxlbmd0aCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdGV4dFJhbmdlLmdldExpbmVOdW1iZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFTVE5vZGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyB2YWx1ZSA9ICJmYWxzZSI7Ci0JCVN0cmluZyBlbGVtZW50ID0gImZyZWQ9IiArIHZhbHVlOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheigiICsgZWxlbWVudCArICIpKSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQkJSVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBuZXcgQVNUTm9kZVRleHRSYW5nZShhZWEuYXN0Tm9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHZhbHVlLmxlbmd0aCgpLCB0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBlbGVtZW50ID0gIlwieHh4XCIiOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKCIgKyBlbGVtZW50ICsgIikiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQotCQlJVGV4dFJhbmdlIHRleHRSYW5nZSA9IG5ldyBBU1ROb2RlVGV4dFJhbmdlKGFlYS5hc3ROb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UoKS5pbmRleE9mKGVsZW1lbnQpLCB0ZXh0UmFuZ2UuZ2V0T2Zmc2V0KCkpOwotCQlhc3NlcnRFcXVhbHMoZWxlbWVudC5sZW5ndGgoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QVNUTm9kZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0KLQkJSVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBuZXcgQVNUTm9kZVRleHRSYW5nZShhZWEuYXN0Tm9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlKCkuaW5kZXhPZihhbm5vdGF0aW9uKSwgdGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFubm90YXRpb24ubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIiwgZmFsc2UpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD1mYWxzZSkpKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTNhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhAQmFyKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ4eHgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXI9XCJ4eHhcIikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInRydWUiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD10cnVlKSkpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgidHJ1ZSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIoamltbXk9QEJheihmcmVkPXRydWUpKSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIpIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieXl5Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oYmFyPVwieXl5XCIpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyPVwieHh4XCIpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IFN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhcInp6elwiKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlPVwienp6XCIsIGJhcj1cInh4eFwiKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7IFN0cmluZyBiYXooKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmF6Iik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ5eXkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhiYXI9XCJ4eHhcIiwgYmF6ID0gXCJ5eXlcIikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUxMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiaW50IGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheltdIGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PXtAYW5ub3QuQmF6KGZyZWQ9MCksIEBhbm5vdC5CYXooZnJlZD0xKSwgQGFubm90LkJheihmcmVkPTIpLCBAYW5ub3QuQmF6KGZyZWQ9Myl9KSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsIDIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYTMsICJmcmVkIiwgTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQotCQlhc3NlcnRFcXVhbHMoIjIiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JCWFlYS5zZXRWYWx1ZSgiNDgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PXtAYW5ub3QuQmF6KGZyZWQ9MCksIEBhbm5vdC5CYXooZnJlZD0xKSwgQGFubm90LkJheihmcmVkPTQ4KSwgQGFubm90LkJheihmcmVkPTMpfSkpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgInZhbHVlIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ4eHgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhcInh4eFwiKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhcInp6elwiKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJ2YWx1ZSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oXCJ4eHhcIikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUxpdGVyYWwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS5sYW5nLk9iamVjdC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiamF2YS5sYW5nLk9iamVjdCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhcj1qYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1pbnQuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAuRW50cnkiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWludC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJpbnQiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXI9aW50LmNsYXNzKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZUxpdGVyYWw0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9dm9pZC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW0xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWVudW1zLlRlc3RFbnVtLlhYWCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uWFhYIiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW0yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFgiLCAiQGFubm90LkZvbyhiYXI9WFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5YWFgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlRW51bTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlRW51bTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiZW51bXMuVGVzdEVudW0iLCAiQGFubm90LkZvbyhiYXI9VGVzdEVudW0uWFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5YWFgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhiYXI9WFhYKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFgiLCBhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9WFhYKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0uWFhYIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYOyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e1wic3RyaW5nMFwiLCBcInN0cmluZzFcIn0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdBcnJheUNvbmNhdGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17XCJzdHJpXCIgKyBcIm5nMFwiLCBcInNcIiArIFwidHJpbmcxXCJ9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsic3RyaW5nMCIsICJzdHJpbmcxIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlU3RyaW5nQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXt9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdBcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cInN0cmluZzBcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7InN0cmluZzAifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVOdWxsU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhcj17XCJzdHJpbmcwXCIsXCJzdHJpbmcxXCJ9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7InN0cmluZzAiLCAic3RyaW5nMSJ9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheUVtcHR5UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZ0FycmF5RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhcj17fSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPiBleHByZXNzaW9uQ29udmVydGVyID0gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgZXhwcmVzc2lvbkNvbnZlcnRlcik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9XCJzdHJpbmcwXCIpIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsic3RyaW5nMCJ9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17ZW51bXMuVGVzdEVudW0uWFhYLCBlbnVtcy5UZXN0RW51bS5ZWVl9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgImVudW1zLlRlc3RFbnVtLllZWSJ9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW1BcnJheUludmFsaWRFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtlbnVtcy5UZXN0RW51bS5YWFgsIDg4fSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCIsIG51bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW1BcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e30pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nWzBdLCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW1BcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1lbnVtcy5UZXN0RW51bS5YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVFbnVtQXJyYXlTaW5nbGVFbGVtZW50SW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwiXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10ge251bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZU51bGxFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9e1hYWCxZWVl9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCIsICJlbnVtcy5UZXN0RW51bS5ZWVkifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYOyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLllZWTsiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28iOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28oYmFyPXt9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIsIHRydWUsIGZhbHNlKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9WFhYKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCJ9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmQ0MmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuamR0dXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZVR5cGUoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmFyIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IHlhbmEoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyKHlhbmE9QGFubm90LkJheikpIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAiYW5ub3QuQmF6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEzKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJheiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OdWxsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OdWxsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPVwiYW5ub3QuQmFyXCIpIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTnVsbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyMiBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyMikiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIiwgZmFsc2UpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPVwiYW5ub3QuQmFyXCIpIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhcjIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyMikiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBuZXN0ZWRBbm5vdGF0aW9uMigpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24xKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb24xPUBhbm5vdC5CYXIobmVzdGVkQW5ub3RhdGlvbjI9QGFubm90LkJheikpIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhRm9vID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUJhciA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUZvbywgIm5lc3RlZEFubm90YXRpb24xIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUJhciwgIm5lc3RlZEFubm90YXRpb24yIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmF6Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241YSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogbmVzdGVkQW5ub3RhdGlvbjIoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uMSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AYW5ub3QuQmFyKG5lc3RlZEFubm90YXRpb24yPUBhbm5vdC5CYXopKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUZvbyA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWFCYXIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWFGb28sICJuZXN0ZWRBbm5vdGF0aW9uMSIsICJhbm5vdC5CYXIiLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhQmFyLCAibmVzdGVkQW5ub3RhdGlvbjIiLCAiYW5ub3QuQmF6IiwgZmFsc2UpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbjE9QEJhcikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb249QEJhcikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIik7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIik7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsgU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbj1AQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyBTdHJpbmcgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbj1AQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIik7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIik7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIik7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbj1AQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcih5eXk9XCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb240KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uPUBCYXIoeXl5PVwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHl5eT1cInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhciB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uOChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjFiNDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L05lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qZHR1dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk1lbWJlckFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhhbm5vdGF0aW9uTmFtZSwgIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBhbm5vdGF0aW9uQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlVHlwZSgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIsIEBhbm5vdC5CYXIoXCJ0d29cIil9KSIpOwotCQkvLyAwCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0KLQkJLy8gMQotCQlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCWFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoeWFuYT1AYW5ub3QuQmF6KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuQmF6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEzKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJheiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoeWFuYT17QGFubm90LkJhen0pKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTMpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmF6IiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQotCQkvLyBuYW1lIG1pc21hdGNoCi0JCWRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuWHl6Iik7Ci0JCWFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEzKTsKLQkJYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbk51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OdWxsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkJhciIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbk51bGwzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTnVsbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJOb3RCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OdWxsNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyLCBAYW5ub3QuQmFyKFwidHdvXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OdWxsNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIlh5eiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkJheiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6W10geWFuYSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKHlhbmE9e0Bhbm5vdC5CYXp9KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoIkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuWHl6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEzKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e251bGwsIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJhbm5vdC5CYXIxXCIsIFwiYW5ub3QuQmFyMlwiLCBcImFubm90LkJhcjNcIn0pIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuTm90QmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIoMCksIEBhbm5vdC5Ob3RCYXIoMSl9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhYS5nZXRBbm5vdGF0aW9uKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241YSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIiwgZmFsc2UpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYWExLmdldEFubm90YXRpb24oKS5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QuRm9vOyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuTm90QmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSksIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZShhYTEuZ2V0QW5ub3RhdGlvbigpLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbigpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSksIG51bGwsIEBhbm5vdC5CYXIoMyl9KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKSwgQGFubm90LkJhcigyKSwgQGFubm90LkJhcigzKX0pIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFhMS5nZXRBbm5vdGF0aW9uKCkuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKCksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKSwgbnVsbCwgQGFubm90LkJhcigzKX0pIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDApKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKCksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigwKSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbigpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKSwgbnVsbH0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigwKSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbigpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBudWxsLCBAYW5ub3QuQmFyKDMpfSkiOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKCksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKSwgQGFubm90LkJhcigzKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMil9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oKSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDApKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKCksICJuZXN0ZWRBbm5vdGF0aW9ucyIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCwgQGFubm90LkJhcigxKX0pIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDEsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBudWxsfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDApKSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKCksICJuZXN0ZWRBbm5vdGF0aW9ucyIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKSwgQGFubm90LkJhcigzKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIG51bGwsIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oKSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbigpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYXNzZXJ0TnVsbChhYS5nZXRBbm5vdGF0aW9uKCkpOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLEBCYXJ9KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zPXtudWxsLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0BCYXIsIFwidHdvXCJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJCYXJ9KSIpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyg3KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7NyxudWxsLG51bGwsbnVsbCxudWxsLEBCYXJ9KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90LkJhcig1NSkpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDU1KSxAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQmFyfSkiKTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuTm90QmFyLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoODgpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcig4OCkpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDg4KSxudWxsLEBCYXJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90LkJhcig4OCkpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDg4KSxudWxsLEBCYXJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoODgpLCBAYW5ub3QuQmFyKDc3KX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA0LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDg4KSwgQGFubm90LkJhcig3NyksIG51bGwsIG51bGwsIjsgIC8vIHRoZSBsaW5lIGdldHMgc3BsaXQKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDQsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSIpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKDg4KSkiKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZT1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoTUlTU0lORyl9KSIpOyAgLy8gPz8/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsgYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zPXtudWxsLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcihNSVNTSU5HKX0pIik7ICAvLyA/Pz8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QEJhcig4OCksIFwidHdvXCJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjExKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoTUlTU0lORyl9KSIpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyg3KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEzKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7NyxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoTUlTU0lORyl9KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE1KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDU1KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoNTUpLEBCYXIoODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE2KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QEJhcig4OCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXIoTUlTU0lORyl9KSIpOyAgLy8gPz8/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTkoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE5KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjAoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIwKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcig3NykpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjIoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoeHh4PTg4KSkiKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIik7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcih4eHg9ODgpKSIpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoeHh4PTg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcih4eHg9ODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsgU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWU9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnM9QEJhcih4eHg9ODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHh4eD04OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsgU3RyaW5nIHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zPXtudWxsLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcigpfSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlPVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zPXtudWxsLG51bGwsbnVsbCxudWxsLG51bGwsQEJhcigpfSkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0BCYXIoeHh4PTg4KSwgXCJ0d29cIn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtcIm9uZVwiLCBcInR3b1wifSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcigpfSkiKTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDcpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoeHh4PTg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEzKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7NyxudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoKX0pIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHh4eD04OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoNTUpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig1NSksQEJhcih4eHg9ODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QEJhcih4eHg9ODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE3KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFyKCl9KSIpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcih4eHg9ODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCQl0aGlzLmlkRmllbGQoKS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTkoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE5KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24yMCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKHh4eD04OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0JCXRoaXMuaWRGaWVsZCgpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yMChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMjAoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKCl9KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcig3NykpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoeHh4PTg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIyKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24yMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMDApKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCxAYW5ub3QuQmFyKDAwKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMTEpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgQGFubm90LkJhcigzMyl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBAYW5ub3QuQmFyKDMzKSwgQGFubm90LkJhcig0NCl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgbnVsbCwgQGFubm90LkJhcig0NCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIG51bGwsIEBhbm5vdC5CYXIoMjIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDMpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBAYW5ub3QuQmFyKDAwKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBudWxsLCBAYW5ub3QuQmFyKDQ0KX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMiksIG51bGwsIEBhbm5vdC5CYXIoNDQpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkKTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSI7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoZXhwZWN0ZWQpOyAgLy8gdGhlIHNvdXJjZSBzaG91bGQgYmUgdW5jaGFuZ2VkCi0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBNZW1iZXJJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcigwMCkpIjsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDAwKSkiKTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IE1lbWJlckluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgbnVsbCwgQGFubm90LkJhcigyMil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDIyKSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgbnVsbCwgQGFubm90LkJhcigzMyl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpfSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgTWVtYmVySW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTAxNGI2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpkdHV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlVHlwZSgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHt9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuRm9vIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbygxKSBAYW5ub3QuRm9vKDIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkZvbyIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSk7Ci0JCUV4cHJlc3Npb24gdmFsdWUgPSAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLk5VTUJFUl9MSVRFUkFMLCB2YWx1ZS5nZXROb2RlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxIiwgKChOdW1iZXJMaXRlcmFsKSB2YWx1ZSkuZ2V0VG9rZW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoImFubm90LkZvbyIsICJARm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25OdWxsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb3AiKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvcCIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvcCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQkvLyB1bi1xdWFsaWZpZWQgbmFtZQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oMSkgQGFubm90LkZvbygyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKDEpIEBhbm5vdC5Gb28oMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IE1lbWJlckFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZCgpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vKDEpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oMikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoKSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKDg4KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKCksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkZvbyg4OCkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpIik7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iKTsKLQkJdGhpcy5pZEZpZWxkKCkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyPVwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSIpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTWVtYmVyVmFsdWVQYWlyIG12cCA9IHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksICJiYXIiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQl0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKS5hZGQobXZwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9UeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9UeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3MTE1Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmludGVybmFsLmpkdHV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuVHlwZTsKLQotcHVibGljIGNsYXNzIFR5cGVUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElUeXBlIGpkdFR5cGU7Ci0JcHJpdmF0ZSBUeXBlIHRlc3RUeXBlOwotCi0KLQlwdWJsaWMgVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuamR0VHlwZSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy50ZXN0VHlwZSA9IG5ldyBUeXBlKHRoaXMuamR0VHlwZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0VHlwZSA9IG51bGw7Ci0JCXRoaXMuamR0VHlwZSA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEpkdE1lbWJlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHModGhpcy5qZHRUeXBlLCB0aGlzLnRlc3RUeXBlLmdldEpkdE1lbWJlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBYnN0cmFjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RUeXBlLmlzQWJzdHJhY3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvcExldmVsRGVjbGFyaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0VHlwZSwgdGhpcy50ZXN0VHlwZS50b3BMZXZlbERlY2xhcmluZ1R5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmluZ1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRlc3RUeXBlLmdldERlY2xhcmluZ1R5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdGhpcy50ZXN0VHlwZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZXh0UmFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuamR0VHlwZS5nZXRPcGVuYWJsZSgpLmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0JCUlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy50ZXN0VHlwZS50ZXh0UmFuZ2UoKTsKLQkJU3RyaW5nIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCWFzc2VydFRydWUoYm9keS5zdGFydHNXaXRoKCJwdWJsaWMgY2xhc3MgIiArIFRZUEVfTkFNRSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRDb3JlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRDb3JlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QyZmZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0Q29yZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb3JlTW9kZWxUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZU1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNb2RlbEluaXRpYWxpemF0aW9uVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb3JlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL01vZGVsSW5pdGlhbGl6YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9Nb2RlbEluaXRpYWxpemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwZWMyNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL01vZGVsSW5pdGlhbGl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0RmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEluaXRpYWxpemF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBJSnBhTW9kZWwganBhTW9kZWw7Ci0JCi0JCi0JcHVibGljIE1vZGVsSW5pdGlhbGl6YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJdGhpcy5qcGFNb2RlbCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhTW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJdGhpcy5qcGFNb2RlbCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JLyoqIAotCSAqIEJ1aWxkcyBhIHByb2plY3Qgd2l0aCB0aGUgamF2YSBhbmQgdXRpbGl0eSBmYWNldHMgaW5zdGFsbGVkLCBhbmQgd2l0aAotCSAqIHByZS1leGlzdGluZyBlbnRpdGllcyBhZGRlZC4KLQkgKi8KLQlwcml2YXRlIFRlc3RGYWNldGVkUHJvamVjdCBidWlsZFRlc3RQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUZXN0RmFjZXRlZFByb2plY3QgdGVzdFByb2plY3QgPSBuZXcgVGVzdEZhY2V0ZWRQcm9qZWN0KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcyksIHRydWUpOwotCQl0ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoImpzdC5qYXZhIiwgIjUuMCIpOwotCQl0ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoImpzdC51dGlsaXR5IiwgIjEuMCIpOwotCQl0ZXN0UHJvamVjdC5jcmVhdGVGaWxlKAotCQkJbmV3IFBhdGgoInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5LmphdmEiKSwKLQkJCSJwYWNrYWdlIHRlc3QucGtnOyBARW50aXR5IHB1YmxpYyBjbGFzcyBUZXN0RW50aXR5IHt9Iik7Ci0JCXRlc3RQcm9qZWN0LmNyZWF0ZUZpbGUoCi0JCQluZXcgUGF0aCgic3JjL3Rlc3QucGtnL1Rlc3RFbnRpdHkyLmphdmEiKSwKLQkJCSJwYWNrYWdlIHRlc3QucGtnOyBARW50aXR5IHB1YmxpYyBjbGFzcyBUZXN0RW50aXR5MiB7fSIpOwotCQlyZXR1cm4gdGVzdFByb2plY3Q7Ci0JfQkKLQkJCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuanBhTW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmFjZXRJbnN0YWxsYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRlc3RGYWNldGVkUHJvamVjdCB0ZXN0UHJvamVjdCA9IGJ1aWxkVGVzdFByb2plY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmpwYU1vZGVsLmdldEpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JCXRlc3RQcm9qZWN0Lmluc3RhbGxGYWNldCgianB0LmpwYSIsICIxLjAiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuanBhTW9kZWwuanBhUHJvamVjdHMoKSkpOwotCQlJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5qcGFNb2RlbC5nZXRKcGFQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqcGFQcm9qZWN0LmpwYUZpbGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgoInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5LmphdmEiKSkpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgoInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5Mi5qYXZhIikpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0T3BlbmluZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGVzdEZhY2V0ZWRQcm9qZWN0IHRlc3RQcm9qZWN0ID0gYnVpbGRUZXN0UHJvamVjdCgpOwotCQl0ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoImpwdC5qcGEiLCAiMS4wIik7Ci0JCXRlc3RQcm9qZWN0LmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoISB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpOwotCQl0ZXN0UHJvamVjdC5vcGVuKCk7Ci0JCUlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmpwYU1vZGVsLmdldEpwYVByb2plY3QodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgoInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5LmphdmEiKSkpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgoInNyYy90ZXN0LnBrZy9UZXN0RW50aXR5Mi5qYXZhIikpKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGMzMDZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYVBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nc0ludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sRW50aXR5SW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUm9vdENvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlSnBhUGxhdGZvcm1UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiUGxhdGZvcm1UZXN0UHJvamVjdCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gInBsYXRmb3JtLnRlc3QiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTF9MT0NBVElPTiA9ICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUk1fWE1MX0xPQ0FUSU9OID0gInNyYy9NRVRBLUlORi9vcm0ueG1sIjsKLQkKLQkKLQlwdWJsaWMgQmFzZUpwYVBsYXRmb3JtVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJanBhUHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWpwYVByb2plY3QuZGlzcG9zZSgpOwotCQlqcGFQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRUeXBlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlGaWxlIHBlcnNpc3RlbmNlWG1sSUZpbGUgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKFBFUlNJU1RFTkNFX1hNTF9MT0NBVElPTik7Ci0JCUlKcGFGaWxlIHBlcnNpc3RlbmNlWG1sSnBhRmlsZSA9IGpwYVByb2plY3QuZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGUocGVyc2lzdGVuY2VYbWxJRmlsZSk7Ci0JCVBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlIHBlcnNpc3RlbmNlUm9vdCA9IChQZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZSkgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLmdldENvbnRlbnQoKTsKLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVJvb3QuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCi0JCUlGaWxlIG9ybVhtbElGaWxlID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShPUk1fWE1MX0xPQ0FUSU9OKTsKLQkJSUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IGpwYVByb2plY3QuZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGUob3JtWG1sSUZpbGUpOwotCQlYbWxSb290Q29udGVudE5vZGUgb3JtUm9vdCA9IChYbWxSb290Q29udGVudE5vZGUpIG9ybVhtbEpwYUZpbGUuZ2V0Q29udGVudCgpOwotCQlFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzID0gb3JtUm9vdC5nZXRFbnRpdHlNYXBwaW5ncygpOwotCQkKLQkJLy8gYWRkIHhtbCBwZXJzaXN0ZW50IHR5cGUKLQkJWG1sRW50aXR5SW50ZXJuYWwgeG1sRW50aXR5ID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5SW50ZXJuYWwoKTsKLQkJeG1sRW50aXR5LnNldFNwZWNpZmllZE5hbWUoIlhtbEVudGl0eSIpOwotCQllbnRpdHlNYXBwaW5ncy5nZXRUeXBlTWFwcGluZ3MoKS5hZGQoeG1sRW50aXR5KTsKLQkJZW50aXR5TWFwcGluZ3MuZVJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqcGFQcm9qZWN0LmdldEpwYVByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLnBlcnNpc3RlbnRUeXBlcyhQUk9KRUNUX05BTUUpKSk7Ci0JCQotCQkvLyBhZGQgamF2YSBwZXJzaXN0ZW50IHR5cGUKLQkJanBhUHJvamVjdC5jcmVhdGVUeXBlKFBBQ0tBR0VfTkFNRSwgIkphdmFFbnRpdHkuamF2YSIsIAotCQkJCSJARW50aXR5IHB1YmxpYyBjbGFzcyBKYXZhRW50aXR5IHt9IgotCQkJKTsKLQkJSmF2YUNsYXNzUmVmIGphdmFDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YUNsYXNzUmVmKCk7Ci0JCWphdmFDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoUEFDS0FHRV9OQU1FICsgIi5KYXZhRW50aXR5Iik7Ci0JCXBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCkuZ2V0Q2xhc3NlcygpLmFkZChqYXZhQ2xhc3NSZWYpOwotCQlwZXJzaXN0ZW5jZS5lUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGpwYVByb2plY3QuZ2V0SnBhUHJvamVjdCgpLmdldFBsYXRmb3JtKCkucGVyc2lzdGVudFR5cGVzKFBST0pFQ1RfTkFNRSkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwdENvcmVQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwdENvcmVQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWU2MzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRDb3JlUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb3JlUGxhdGZvcm1UZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb3JlUGxhdGZvcm1UZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShCYXNlSnBhUGxhdGZvcm1UZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvcmVQbGF0Zm9ybVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0RmFjZXRlZFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MzhmYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFRlc3RGYWNldGVkUHJvamVjdCBleHRlbmRzIFRlc3RQbGF0Zm9ybVByb2plY3QgewotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEZhY2V0ZWRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEZhY2V0ZWRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7Ci0JCXRoaXMuZmFjZXRlZFByb2plY3QgPSB0aGlzLmNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QgY3JlYXRlRmFjZXRlZFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUodGhpcy5nZXRQcm9qZWN0KCksIHRydWUsIG51bGwpOwkJLy8gdHJ1ZSA9ICJjb252ZXJ0IGlmIG5lY2Vzc2FyeSIKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIElGYWNldGVkUHJvamVjdCBnZXRGYWNldGVkUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjZXRlZFByb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbEZhY2V0KFN0cmluZyBmYWNldE5hbWUsIFN0cmluZyB2ZXJzaW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZmFjZXROYW1lKS5nZXRWZXJzaW9uKHZlcnNpb25OYW1lKTsKLQkJdGhpcy5mYWNldGVkUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KGZhY2V0VmVyc2lvbiwgbnVsbCwgbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NTI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogVGhpcyBidWlsZHMgYW5kIGhvbGRzIGEgIkphdmEiIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBhZGRpbmcgcGFja2FnZXMgYW5kIHR5cGVzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdEZhY2V0ZWRQcm9qZWN0IHsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEphdmFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKCJUZXN0SmF2YVByb2plY3QiKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFRlc3RKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQl0aGlzLmluc3RhbGxGYWNldCgianN0LmphdmEiLCAiNS4wIik7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUodGhpcy5nZXRQcm9qZWN0KCkpOwotCQl0aGlzLnNvdXJjZUZvbGRlciA9IHRoaXMuamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYyIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXIoU3RyaW5nIGphclBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0aGlzLmFkZENsYXNzcGF0aEVudHJ5KEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChqYXJQYXRoKSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyeShJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksIGVudHJ5KSwgbnVsbCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBjcmVhdGVQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5zb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCBmYWxzZSwgbnVsbCk7CS8vIGZhbHNlID0gIm5vIGZvcmNlIgotCX0KLQotCS8qKgotCSAqIFRoZSBzb3VyY2Ugc2hvdWxkIE5PVCBjb250YWluIGEgcGFja2FnZSBkZWNsYXJhdGlvbjsKLQkgKiBpdCB3aWxsIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JcHVibGljIElUeXBlIGNyZWF0ZVR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUeXBlKHRoaXMuY3JlYXRlUGFja2FnZShwYWNrYWdlTmFtZSksIGNvbXBpbGF0aW9uVW5pdE5hbWUsIG5ldyBTaW1wbGVTb3VyY2VXcml0ZXIoc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNvdXJjZSBzaG91bGQgTk9UIGNvbnRhaW4gYSBwYWNrYWdlIGRlY2xhcmF0aW9uOwotCSAqIGl0IHdpbGwgYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgSVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lLCBTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVR5cGUodGhpcy5jcmVhdGVQYWNrYWdlKHBhY2thZ2VOYW1lKSwgY29tcGlsYXRpb25Vbml0TmFtZSwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc291cmNlIHNob3VsZCBOT1QgY29udGFpbiBhIHBhY2thZ2UgZGVjbGFyYXRpb247Ci0JICogaXQgd2lsbCBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBJVHlwZSBjcmVhdGVUeXBlKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDIwMDApOwotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzb3VyY2VXcml0ZXIuYXBwZW5kU291cmNlVG8oc2IpOwotCQlTdHJpbmcgc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBhY2thZ2VGcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0TmFtZSwgc291cmNlLCBmYWxzZSwgbnVsbCk7CS8vIGZhbHNlID0gIm5vIGZvcmNlIgotCQlyZXR1cm4gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0JfQotCi0JcHVibGljIElUeXBlIGZpbmRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5maW5kVHlwZShmdWxseVF1YWxpZmllZE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdEZvckluZGV4ZXIoKTsKLQkJdGhpcy5zb3VyY2VGb2xkZXIgPSBudWxsOwotCQl0aGlzLmphdmFQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCB3YWl0Rm9ySW5kZXhlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKAotCQkJbnVsbCwKLQkJCVNlYXJjaFBhdHRlcm4uUl9FWEFDVF9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9DQVNFX1NFTlNJVElWRSwKLQkJCW51bGwsCi0JCQlTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywKLQkJCVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFswXSksCi0JCQluZXcgVHlwZU5hbWVSZXF1ZXN0b3IoKSB7LyogZG8gbm90aGluZyAqL30sCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwKLQkJCW51bGwKLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIGludGVyZmFjZSBTb3VyY2VXcml0ZXIgewotCQl2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1ZmZlciBzYik7Ci0JfQotCi0JcHVibGljIGNsYXNzIFNpbXBsZVNvdXJjZVdyaXRlciBpbXBsZW1lbnRzIFNvdXJjZVdyaXRlciB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHNvdXJjZTsKLQkJcHVibGljIFNpbXBsZVNvdXJjZVdyaXRlcihTdHJpbmcgc291cmNlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoc291cmNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SnBhUHJvamVjdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SnBhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGYwMWU4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpwYVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVByb2plY3QgZXh0ZW5kcyBUZXN0SmF2YVByb2plY3QgewotCXByaXZhdGUgSUpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmphciI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEpwYVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMoIlRlc3RKcGFQcm9qZWN0Iik7Ci0JfQotCi0JcHVibGljIFRlc3RKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBUZXN0SnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQl0aGlzLmluc3RhbGxGYWNldCgianN0LnV0aWxpdHkiLCAiMS4wIik7Ci0JCXRoaXMuaW5zdGFsbEZhY2V0KCJqcHQuanBhIiwgIjEuMCIpOwotCQl0aGlzLmFkZEphcih0aGlzLmphck5hbWUoKSk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLmdldFByb2plY3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBqYXJOYW1lKCkgewotCQlTdHJpbmcgamFyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShKQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCQlpZiAoamFyTmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZICsgIlwiIik7Ci0JCX0KLQkJcmV0dXJuIGphck5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuanBhUHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0UGxhdGZvcm1Qcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYmNhNzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0UGxhdGZvcm1Qcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJnZW5lcmFsIiBwcm9qZWN0LgotICogU3VwcG9ydCBmb3IgYWRkaW5nIG5hdHVyZXMsIGZvbGRlcnMsIGFuZCBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RQbGF0Zm9ybVByb2plY3QgewotCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCi0JLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdFBsYXRmb3JtUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQotCi0JcHVibGljIFRlc3RQbGF0Zm9ybVByb2plY3QoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcygiVGVzdFByb2plY3QiLCBhdXRvQnVpbGQpOwotCX0KLQotCXB1YmxpYyBUZXN0UGxhdGZvcm1Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXRBdXRvQnVpbGQoYXV0b0J1aWxkKTsgIC8vIHdvcmtzcGFjZS13aWRlIHNldHRpbmcKLQkJdGhpcy5wcm9qZWN0ID0gdGhpcy5jcmVhdGVQbGF0Zm9ybVByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCXByaXZhdGUgSVByb2plY3QgY3JlYXRlUGxhdGZvcm1Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcC5jcmVhdGUobnVsbCk7Ci0JCXAub3BlbihudWxsKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2plY3ROYXR1cmUoU3RyaW5nIG5hdHVyZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB0aGlzLnByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKChTdHJpbmdbXSkgQ29sbGVjdGlvblRvb2xzLmFkZChkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKSwgbmF0dXJlSUQpKTsKLQkJdGhpcy5wcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9qZWN0TmF0dXJlKFN0cmluZyBuYXR1cmVJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gdGhpcy5wcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcygoU3RyaW5nW10pIENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKSwgbmF0dXJlSUQpKTsKLQkJdGhpcy5wcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmb2xkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZGlyZWN0bHkgdW5kZXIgdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUZvbGRlcih0aGlzLnByb2plY3QsIG5ldyBQYXRoKGZvbGRlck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmb2xkZXIgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGb2xkZXIoY29udGFpbmVyLCBuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZvbGRlciBpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4KLQkgKi8KLQlwdWJsaWMgSUZvbGRlciBjcmVhdGVGb2xkZXIoSUNvbnRhaW5lciBjb250YWluZXIsIElQYXRoIGZvbGRlclBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKGZvbGRlclBhdGgpOwotCQlpZiAoICEgZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsJCS8vIGZhbHNlID0gIm5vIGZvcmNlIjsgdHJ1ZSA9ICJsb2NhbCIKLQkJfQotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBjb250ZW50IGRpcmVjdGx5IHVuZGVyIHRoZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRmlsZSh0aGlzLnByb2plY3QsIGZpbGVOYW1lLCBjb250ZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRmlsZShJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlRmlsZShjb250YWluZXIsIG5ldyBQYXRoKGZpbGVOYW1lKSwgY29udGVudCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgaW4gdGhlIHByb2plY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIFtyZWxhdGl2ZV0gcGF0aAotCSAqIGFuZCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKElQYXRoIGZpbGVQYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGaWxlKHRoaXMucHJvamVjdCwgZmlsZVBhdGgsIGNvbnRlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIGluIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBmaWxlUGF0aCwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRmlsZShjb250YWluZXIsIGZpbGVQYXRoLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudC5nZXRCeXRlcygpKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGggYW5kIGNvbnRlbnRzLgotCSAqLwotCXB1YmxpYyBJRmlsZSBjcmVhdGVGaWxlKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBmaWxlUGF0aCwgSW5wdXRTdHJlYW0gY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgbGVuID0gZmlsZVBhdGguc2VnbWVudENvdW50KCkgLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKGZpbGVQYXRoLnNlZ21lbnQoaSkpKTsKLQkJCWlmICggISBjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCQkoKElGb2xkZXIpIGNvbnRhaW5lcikuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwkJLy8gdHJ1ZSA9ICJmb3JjZSI7IHRydWUgPSAibG9jYWwiCi0JCQl9Ci0JCX0KLQotCQlJRmlsZSBmaWxlID0gY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoZmlsZVBhdGgubGFzdFNlZ21lbnQoKSkpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7CQkvLyB0cnVlID0gImZvcmNlIgotCQl9Ci0JCWZpbGUuY3JlYXRlKGNvbnRlbnQsIHRydWUsIG51bGwpOwkJLy8gdHJ1ZSA9ICJmb3JjZSIKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5wcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCXdhaXRGb3JKb2JzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMucHJvamVjdC5jbG9zZShudWxsKTsKLQkJd2FpdEZvckpvYnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLnByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwkJLy8gdHJ1ZSA9ICJkZWxldGUgY29udGVudCI7IHRydWUgPSAiZm9yY2UiCi0JCWZvciAoaW50IGkgPSAxOyB0aGlzLnByb2plY3QuZXhpc3RzKCk7IGkrKykgewotCQkJd2FpdEZvckpvYnMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdCBzdGlsbCBleGlzdHM6ICIgKyBpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXYWl0IHVudGlsIGFsbCBiYWNrZ3JvdW5kIHRhc2tzIGFyZSBjb21wbGV0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnMoKSB7Ci0JCXdoaWxlIChKb2IuZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRKb2IoKSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDApOwkvLyBsZXQgb3RoZXIgdGhyZWFkcyBnZXQgc29tZXRoaW5nIGRvbmUKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDJkZWUzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5KcHRDb3JlVGVzdHMiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0JCTxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLQkJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWIwMTI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMDFhY2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5KcHREYlRlc3RzUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiBmYWxzZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eSwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHksCi0gb3JnLmVjbGlwc2UuanB0LmRiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDBkMDEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL2RlcmJ5MTAxLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9kZXJieTEwMS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTAxNDEzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL2RlcmJ5MTAxLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgUGxhdGZvcm0gUHJvcGVydHkgbmFtZXMgJiBEZWZhdWx0Ci0jCi0jICBwcm9maWxlTmFtZSAgLSBqcGF0ZXN0Ci0jICBwcm9maWxlRGVzY3JpcHRpb24gIC0gSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZwotIyAgdXNlck5hbWUgIC0ganBhdGVzdAotIyAgdXNlclBhc3N3b3JkICAtIChlbXB0eSkKLSMgIGRhdGFiYXNlZHJpdmVySmFyTGlzdCAgLSAobWFuZGF0b3J5KQotIyAgZGF0YWJhc2VOYW1lICAtIHRlc3RkYgotIyAgZGF0YWJhc2VVcmwgIC0gKG1hbmRhdG9yeSkKLSMgCi1wcm9maWxlTmFtZSA9IGRlcmJ5MTAxCi1wcm9maWxlRGVzY3JpcHRpb24gPSBEZXJieSAgRW1iZWRkZWQgSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi0jIHNldCB1c2VyIG5hbWUKLXVzZXJOYW1lID0ganBhdGVzdAotdXNlclBhc3N3b3JkID0KLSMgc2V0IHBhdGggdG8gRGVyYnkgZHJpdmVyIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IGM6L2RlcmJ5ZGIvbGliL2RlcmJ5LmphciApCi1kYXRhYmFzZWRyaXZlckphckxpc3QgPSAKLWRhdGFiYXNlTmFtZSA9IHRlc3RkYgotIyBzZXQgZGF0YWJhc2UgVVJMIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlVXJsID0gamRiYzpkZXJieTpjOi9kZXJieWRiL3Rlc3RkYjtjcmVhdGU9dHJ1ZSApICAKLWRhdGFiYXNlVXJsID0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OGZjN2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgUGxhdGZvcm0gUHJvcGVydHkgbmFtZXMgJiBEZWZhdWx0Ci0jCi0jICBwcm9maWxlTmFtZSAgLSBqcGF0ZXN0Ci0jICBwcm9maWxlRGVzY3JpcHRpb24gIC0gSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZwotIyAgdXNlck5hbWUgIC0ganBhdGVzdAotIyAgdXNlclBhc3N3b3JkICAtIChlbXB0eSkKLSMgIGRhdGFiYXNlZHJpdmVySmFyTGlzdCAgLSBqYXIgbGlzdCBzZXBhcmF0ZSBieSBjb21tYSAobWFuZGF0b3J5KSAKLSMgIGRhdGFiYXNlTmFtZSAgLSB0ZXN0ZGIKLSMgIGRhdGFiYXNlVXJsICAtIChtYW5kYXRvcnkpCi0jCi1wcm9maWxlTmFtZSA9IG9yYWNsZVhFMTBnCi1wcm9maWxlRGVzY3JpcHRpb24gPSBYRSAxMGcgUmVsZWFzZSAyICgxMC4yKSBUaGluIEpEQkMgUHJvZmlsZSBmb3IgVGVzdGluZwotdXNlck5hbWUgPSBzY290dAotdXNlclBhc3N3b3JkID0gdGlnZXIKLSMgc2V0IHBhdGggdG8gT3JhY2xlIGRyaXZlciBoZXJlIChleGFtcGxlOiBkYXRhYmFzZWRyaXZlckphckxpc3QgPSBjOi9vcmFjbGUvamRiYy9saWIvb2pkYmMxNC5qYXIgKQotZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gCi1kYXRhYmFzZU5hbWUgPSB0ZXN0ZGIKLSMgc2V0IGRhdGFiYXNlIFVSTCBoZXJlIChleGFtcGxlOiBkYXRhYmFzZVVybCA9IGpkYmM6b3JhY2xlOnRoaW46QGxvY2FsaG9zdDoxNTIxOnRlc3RkYiApICAKLWRhdGFiYXNlVXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNzkxOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIFBsYXRmb3JtIFByb3BlcnR5IG5hbWVzICYgRGVmYXVsdAotIwotIyAgcHJvZmlsZU5hbWUgIC0ganBhdGVzdAotIyAgcHJvZmlsZURlc2NyaXB0aW9uICAtIEpEQkMgUHJvZmlsZSBmb3IgSlBBIFRlc3RpbmcKLSMgIHVzZXJOYW1lICAtIGpwYXRlc3QKLSMgIHVzZXJQYXNzd29yZCAgLSAoZW1wdHkpCi0jICBkYXRhYmFzZWRyaXZlckphckxpc3QgIC0gamFyIGxpc3Qgc2VwYXJhdGUgYnkgY29tbWEgKG1hbmRhdG9yeSkgCi0jICBkYXRhYmFzZU5hbWUgIC0gdGVzdGRiCi0jICBkYXRhYmFzZVVybCAgLSAobWFuZGF0b3J5KQotIwotcHJvZmlsZU5hbWUgPSBvcmFjbGU5aQotcHJvZmlsZURlc2NyaXB0aW9uID0gT3JhY2xlIFRoaW4gSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi11c2VyTmFtZSA9IHNjb3R0Ci11c2VyUGFzc3dvcmQgPSB0aWdlcgotIyBzZXQgcGF0aCB0byBPcmFjbGUgZHJpdmVyIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IGM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzE0LmphciApCi1kYXRhYmFzZWRyaXZlckphckxpc3QgPQotZGF0YWJhc2VOYW1lID0gdGVzdGRiCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOm9yYWNsZTp0aGluOkBzZXJ2ZXI6MTUyMTp0ZXN0ZGIgKSAgCi1kYXRhYmFzZVVybCA9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIyMDA1LnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIyMDA1LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTEzNTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvc3Fsc2VydmVyMjAwNS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIFBsYXRmb3JtIFByb3BlcnR5IG5hbWVzICYgRGVmYXVsdAotIwotIyAgcHJvZmlsZU5hbWUgIC0ganBhdGVzdAotIyAgcHJvZmlsZURlc2NyaXB0aW9uICAtIEpEQkMgUHJvZmlsZSBmb3IgSlBBIFRlc3RpbmcKLSMgIHVzZXJOYW1lICAtIGpwYXRlc3QKLSMgIHVzZXJQYXNzd29yZCAgLSAoZW1wdHkpCi0jICBkYXRhYmFzZWRyaXZlckphckxpc3QgIC0gKG1hbmRhdG9yeSkKLSMgIGRhdGFiYXNlTmFtZSAgLSB0ZXN0ZGIKLSMgIGRhdGFiYXNlVXJsICAtIChtYW5kYXRvcnkpCi0jIAotcHJvZmlsZU5hbWUgPSBzcWxzZXJ2ZXIyMDA1Ci1wcm9maWxlRGVzY3JpcHRpb24gPSBNUyBTUUwgU2VydmVyIDIwMDUgSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi0jIHNldCB1c2VyIG5hbWUKLXVzZXJOYW1lID0gCi11c2VyUGFzc3dvcmQgPSAKLSMgc2V0IHBhdGggdG8gRGVyYnkgZHJpdmVyIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IGM6L3NxbHNlcnZlci9saWIvc3FsamRiYy5qYXIgKQotZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gCi1kYXRhYmFzZU5hbWUgPSB0ZXN0ZGIKLSMgc2V0IGRhdGFiYXNlIFVSTCBoZXJlIChleGFtcGxlOiBkYXRhYmFzZVVybCA9IGpkYmM6c3Fsc2VydmVyOi8vbG9jYWxob3N0OjE0MzM7ZGF0YWJhc2VOYW1lPXRlc3RkYiApICAKLWRhdGFiYXNlVXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0ZmUyNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEpQQSBEQiBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjZlYTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtcy5BbGxQbGF0Zm9ybVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci0KLS8qKgotICogIEpwdERiVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdERiVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKCBuZXcgU3RyaW5nW10geyAiLWMiLCBKcHREYlRlc3RzLmNsYXNzLmdldE5hbWUoKX0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoIEpwdERiVGVzdHMuY2xhc3MpKTsKLSAgICAKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggQWxsUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEpwdERiVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNlZDM0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiAgSnB0RGJUZXN0c1BsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSnB0RGJUZXN0c1BsdWdpbiBwbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSUQgPSAib3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHREYlRlc3RzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKcHREYlRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9BbGxQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5YzQyMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiAgQWxsUGxhdGZvcm1UZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWxsUGxhdGZvcm1UZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLm1haW4oIG5ldyBTdHJpbmdbXSB7ICItYyIsICBBbGxQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldE5hbWUoKX0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSggQ2xhc3NUb29scy5wYWNrYWdlTmFtZUZvciggQWxsUGxhdGZvcm1UZXN0cy5jbGFzcykpOwotCi0gICAgICAgIC8vIFRPRE8gLSBVbmNvbW1lbnQgdGhlIHBsYXRmb3JtIHRvIHRlc3QuCi0vLyAgICAgICAgc3VpdGUuYWRkVGVzdCggRGVyYnkxMDFUZXN0cy5zdWl0ZSgpKTsKLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0KCBPcmFjbGU5aVRlc3RzLnN1aXRlKCkpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3QoIE9yYWNsZTEwZ1Rlc3RzLnN1aXRlKCkpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3QoIFNRTFNlcnZlcjIwMDVUZXN0cy5zdWl0ZSgpKTsKLQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbGxQbGF0Zm9ybVRlc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZGVmZmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiAtIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LkNvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLklEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLklEcml2ZXJNZ210Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5JUHJvcGVydHlTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLlByb3BlcnR5U2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuWE1MRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC5Db25uZWN0aXZpdHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkRUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLkpwdERiVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqICBCYXNlIGNsYXNzIGZvciBhbGwgc3VwcG9ydGVkIERUUCBwbGF0Zm9ybS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUUFBsYXRmb3JtVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IGNvbm5lY3Rpb25SZXBvc2l0b3J5OwotICAgIAotICAgIHByaXZhdGUgUHJvcGVydGllcyBwbGF0Zm9ybVByb3BlcnRpZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudERiVmVuZG9yOwotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnREYlZlcnNpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWSA9ICJjb25maWciOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJwcm9maWxlTmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9ERVNDUklQVElPTl9QUk9QRVJUWSA9ICJwcm9maWxlRGVzY3JpcHRpb24iOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfTkFNRV9QUk9QRVJUWSA9ICJ1c2VyTmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QQVNTV09SRF9QUk9QRVJUWSA9ICJ1c2VyUGFzc3dvcmQiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0RSSVZFUl9KQVJfUFJPUEVSVFkgPSAiZGF0YWJhc2Vkcml2ZXJKYXJMaXN0IjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9OQU1FX1BST1BFUlRZID0gImRhdGFiYXNlTmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfVVJMX1BST1BFUlRZID0gImRhdGFiYXNlVXJsIjsJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX05BTUVfREVGQVVMVCA9ICJqcGF0ZXN0IjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX0RFU0NSSVBUSU9OX0RFRkFVTFQgPSAiSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZyI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9OQU1FX0RFRkFVTFQgPSAidXNlck5hbWUiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUEFTU1dPUkRfREVGQVVMVCA9ICIiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUVfREVGQVVMVCA9ICJ0ZXN0ZGIiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfUFJPUEVSVFlfTUVTU0FHRSA9ICJFbnRlciBtaXNzaW5nIHByb3BlcnR5IGluIHBsYXRmb3JtIGNvbmZpZyBmaWxlIChjb25maWcvZGF0YWJhc2UucHJvcGVydGllcykiOwkKLQotICAgIHB1YmxpYyBEVFBQbGF0Zm9ybVRlc3RzKCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlciggbmFtZSk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXBvc2l0b3J5ID0gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uUmVwb3NpdG9yeS5pbml0aWFsaXplTGlzdGVuZXJzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggdGhpcy5wbGF0Zm9ybUlzTmV3KCkpIHsKLSAgICAgICAgCXRoaXMubG9hZFBsYXRmb3JtUHJvcGVydGllcygpOwotICAgICAgICAJCi0gICAgICAgIAl0aGlzLmJ1aWxkRHJpdmVyRGVmaW5pdGlvbkZpbGUoIElEcml2ZXJNZ210Q29uc3RhbnRzLkRSSVZFUl9GSUxFKTsKLSAgICAgICAgCXRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZSggdGhpcy5wcm9maWxlTmFtZSgpKTsKLSAgICAgICAgCXRoaXMuY3VycmVudERiVmVuZG9yID0gdGhpcy5kYXRhYmFzZVZlbmRvcigpOwotICAgICAgICAJdGhpcy5jdXJyZW50RGJWZXJzaW9uID0gdGhpcy5kYXRhYmFzZVZlcnNpb24oKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnZlcmlmeVByb2ZpbGVOYW1lZCggdGhpcy5wcm9maWxlTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uUmVwb3NpdG9yeS5kaXNwb3NlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRoaXMuY29ubmVjdCgpOwotCQkKLSAgICAgICAgdGhpcy52ZXJpZnlEYXRhYmFzZVZlcnNpb25OdW1iZXIoKTsKLSAgICAgICAgdGhpcy52ZXJpZnlDb25uZWN0aW9uKCk7Ci0gICAgICAgIHRoaXMudmVyaWZ5RGF0YWJhc2VDb250ZW50KCk7Ci0KLSAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlcygpIHsKLQkJLy8gR2V0dGluZyB0aGUgcHJvZmlsZSBkaXJlY3RseSBmcm9tIERUUCBQcm9maWxlTWFuYWdlcgotCQlJQ29ubmVjdGlvblByb2ZpbGVbXSBwcm9maWxlcyA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvZmlsZXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHByb2ZpbGVzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIHByb2ZpbGVzLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlc0J5UHJvdmlkZXIoKSB7Ci0JCS8vIEdldCBQcm9maWxlcyBCeSBQcm92aWRlcklECi0JCUlDb25uZWN0aW9uUHJvZmlsZVtdIHByb2ZpbGVzID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9maWxlQnlQcm92aWRlcklEKCB0aGlzLmdldFByb2ZpbGUoKS5nZXRQcm92aWRlcklkKCkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggcHJvZmlsZXMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggcHJvZmlsZXMubGVuZ3RoID4gMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlQnlOYW1lKCkgewotCQkvLyBHZXQgUHJvZmlsZSBCeSBOYW1lCi0JCUlDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9maWxlQnlOYW1lKCB0aGlzLnByb2ZpbGVOYW1lKCkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggZHRwUHJvZmlsZSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCBkdHBQcm9maWxlLmdldE5hbWUoKS5lcXVhbHMoIHRoaXMucHJvZmlsZU5hbWUoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvZmlsZUJ5SW5zdGFuY2VJZCgpIHsKLQkJLy8gR2V0IFByb2ZpbGUgQnkgSW5zdGFuY2VJRAotCQlJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvZmlsZUJ5SW5zdGFuY2VJRCggdGhpcy5nZXRQcm9maWxlKCkuZ2V0SW5zdGFuY2VJZCgpKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIGR0cFByb2ZpbGUpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggZHRwUHJvZmlsZS5nZXROYW1lKCkuZXF1YWxzKCB0aGlzLnByb2ZpbGVOYW1lKCkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIHRlc3RzICoqKioqKioqKioKLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlEYXRhYmFzZVZlcnNpb25OdW1iZXIoKSB7Ci0gICAgCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5nZXRQcm9maWxlKCkuZ2V0RGF0YWJhc2UoKTsKLSAgICAJQXNzZXJ0LmFzc2VydE5vdE51bGwoIGRhdGFiYXNlKTsKLSAgICAJCi0gICAgICAgIFN0cmluZyBhY3R1YWxWZXJzaW9uTnVtYmVyID0gZGF0YWJhc2UuZ2V0VmVyc2lvbigpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRWZXJzaW9uTnVtYmVyID0gdGhpcy5kYXRhYmFzZVZlcnNpb24oKTsKLSAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJFeHBlY3RlZCB2ZXJzaW9uIG51bWJlcjogIiArIGV4cGVjdGVkVmVyc2lvbk51bWJlciArICIgYnV0IHRoZSBhY3R1YWwgdmVyc2lvbiBudW1iZXIgd2FzOiAiICsgYWN0dWFsVmVyc2lvbk51bWJlcjsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZXJyb3JNZXNzYWdlLCBhY3R1YWxWZXJzaW9uTnVtYmVyLmluZGV4T2YoIGV4cGVjdGVkVmVyc2lvbk51bWJlcikgIT0gLTEpOwotCi0gICAgICAgIFN0cmluZyBhY3R1YWxWZW5kb3IgPSBkYXRhYmFzZS5nZXRWZW5kb3IoKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVmVuZG9yID0gdGhpcy5kYXRhYmFzZVZlbmRvcigpOwotICAgICAgICBlcnJvck1lc3NhZ2UgPSAiRXhwZWN0ZWQgdmVuZG9yOiAiICsgZXhwZWN0ZWRWZW5kb3IgKyAiIGJ1dCB0aGUgYWN0dWFsIHZlbmRvciB3YXM6ICIgKyBhY3R1YWxWZW5kb3I7Ci0gICAgICAgIGFzc2VydEVxdWFscyggZXJyb3JNZXNzYWdlLCBhY3R1YWxWZW5kb3IsIGV4cGVjdGVkVmVuZG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbm5lY3Rpb24oKSB7Ci0gICAgCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHRoaXMuZ2V0UHJvZmlsZSgpLmdldENvbm5lY3Rpb24oKTsKLSAgICAJQXNzZXJ0LmFzc2VydE5vdE51bGwoIGNvbm5lY3Rpb24pOwotCi0gICAgICAgIFN0cmluZyBhY3R1YWxGYWN0b3J5ID0gY29ubmVjdGlvbi5nZXRGYWN0b3J5SWQoKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkRmFjdG9yeSA9IERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5DT05ORUNUSU9OX1RZUEU7Ci0gICAgCVN0cmluZyBlcnJvck1lc3NhZ2UgPSAiRXhwZWN0ZWQgZmFjdG9yeTogIiArIGV4cGVjdGVkRmFjdG9yeSArICIgYnV0IHRoZSBhY3R1YWwgZmFjdG9yeSB3YXM6ICIgKyBhY3R1YWxGYWN0b3J5OwotICAgIAlhc3NlcnRFcXVhbHMoIGVycm9yTWVzc2FnZSwgYWN0dWFsRmFjdG9yeSwgZXhwZWN0ZWRGYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlQ29udGVudCgpIHsKLSAgICAJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldFByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotICAgIAlBc3NlcnQuYXNzZXJ0VHJ1ZSggZGF0YWJhc2Uuc2NoZW1hdGFTaXplKCkgPiAwKTsKLQkJCi0gICAgICAgIFNjaGVtYSBzY2hlbWEgPSBkYXRhYmFzZS5zY2hlbWFOYW1lZCggdGhpcy5nZXRQcm9maWxlKCkuZ2V0VXNlck5hbWUoKSk7Ci0JCWlmKCBzY2hlbWEgIT0gbnVsbCkgewotCQkJQXNzZXJ0LmFzc2VydFRydWUoIHNjaGVtYS5zZXF1ZW5jZXNTaXplKCkgPj0gMCk7Ci0JCQkKLQkJCU9iamVjdFtdIHRhYmxlTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkoIHNjaGVtYS50YWJsZU5hbWVzKCkpOwotCQkJaWYoIHRhYmxlTmFtZXMubGVuZ3RoID49IDEpIHsKLQkJCQlUYWJsZSB0YWJsZSA9IHNjaGVtYS50YWJsZU5hbWVkKCggU3RyaW5nKXRhYmxlTmFtZXNbIDBdKTsKLQkJCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggdGFibGUuY29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggdGFibGUuZm9yZWlnbktleUNvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJQXNzZXJ0LmFzc2VydFRydWUoIHRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpID49IDApOwotCQkJCUFzc2VydC5hc3NlcnRUcnVlKCB0YWJsZS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCX0KLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlQcm9maWxlTmFtZWQoIFN0cmluZyBwcm9maWxlTmFtZSkgewotICAgIAkKLSAgICAJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZU5hbWVkKCBwcm9maWxlTmFtZSk7Ci0gICAgCUFzc2VydC5hc3NlcnRUcnVlKCAiQ29ubmVjdGlvblByb2ZpbGUgbm90IGZvdW5kIiwgcHJvZmlsZU5hbWUuZXF1YWxzKCBwcm9maWxlLmdldE5hbWUoKSkpOwotICAgIH0KLQotCS8vICoqKioqIFBsYXRmb3JtIHNwZWNpZmljIGJlaGF2aW9yICoqKioqCi0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZHJpdmVyTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvblR5cGUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRyaXZlckRlZmluaXRpb25JZCgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZHJpdmVyQ2xhc3MoKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpOwotCi0JLy8gKioqKiogQmVoYXZpb3IgKioqKioKLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbm5lY3QoKSB7Ci0KLSAgICAgICAgdGhpcy5nZXRQcm9maWxlKCkuY29ubmVjdCgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggIkNvbm5lY3QgZmFpbGVkLiIsIHRoaXMuZ2V0UHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNjb25uZWN0KCkgewotICAgIAkKLSAgICAJdGhpcy5nZXRQcm9maWxlKCkuZGlzY29ubmVjdCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoICJEaXNjb25uZWN0IGZhaWxlZC4iLCB0aGlzLmdldFByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKTsKLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotICAgIHByb3RlY3RlZCBTY2hlbWEgZ2V0U2NoZW1hTmFtZWQoIFN0cmluZyBzY2hlbWFOYW1lKSB7IAotCi0JICAgIHJldHVybiB0aGlzLmdldFByb2ZpbGUoKS5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVkKCBzY2hlbWFOYW1lKTsKLSAgICB9Ci0JCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0VGFibGVzKCkgewotCQkKLSAgICAgICAgU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hTmFtZWQoIHRoaXMuZ2V0UHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpOwotCQlpZiggc2NoZW1hID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKCBzY2hlbWEudGFibGVzKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUYWJsZSBnZXRUYWJsZU5hbWVkKCBTdHJpbmcgdGFibGVOYW1lKSB7IAotCi0JICAgIFNjaGVtYSBzY2hlbWEgPSAgdGhpcy5nZXRTY2hlbWFOYW1lZCggdGhpcy5nZXRQcm9maWxlKCkuZ2V0VXNlck5hbWUoKSk7Ci0JICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCBzY2hlbWEpOwotCQotCQlyZXR1cm4gc2NoZW1hLnRhYmxlTmFtZWQoIHRhYmxlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcklkKCkgewotICAgICAgICByZXR1cm4gRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLkNPTk5FQ1RJT05fUFJPRklMRV9UWVBFOwotICAgIH0KLSAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZElzU2F2ZWQoKSB7Ci0gICAgICAgIHJldHVybiAidHJ1ZSI7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvZmlsZU5hbWUoKSB7Ci0gICAgCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggUFJPRklMRV9OQU1FX1BST1BFUlRZLCBQUk9GSUxFX05BTUVfREVGQVVMVCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLSAgICAJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBQUk9GSUxFX0RFU0NSSVBUSU9OX1BST1BFUlRZLCBQUk9GSUxFX0RFU0NSSVBUSU9OX0RFRkFVTFQpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyTmFtZSgpIHsKLSAgICAJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBVU0VSX05BTUVfUFJPUEVSVFksIFVTRVJfTkFNRV9ERUZBVUxUKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyUGFzc3dvcmQoKSB7Ci0gICAgCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggVVNFUl9QQVNTV09SRF9QUk9QRVJUWSwgVVNFUl9QQVNTV09SRF9ERUZBVUxUKTsKLSAgICB9ICAgIAotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VOYW1lKCkgewotICAgIAlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIERCX05BTUVfUFJPUEVSVFksIERCX05BTUVfREVGQVVMVCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2Vkcml2ZXJKYXJMaXN0KCkgewotICAgIAlTdHJpbmcgZGJEcml2ZXJKYXJMaXN0ID0gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIERCX0RSSVZFUl9KQVJfUFJPUEVSVFkpOwotICAgIAlpZiAoIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIGRiRHJpdmVySmFyTGlzdCkpIHsKLSAgICAJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCBNSVNTSU5HX1BST1BFUlRZX01FU1NBR0UpOwotICAgIAl9Ci0gICAgCXJldHVybiBkYkRyaXZlckphckxpc3Q7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VVcmwoKSB7Ci0gICAgCVN0cmluZyBkYlVybCA9IHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBEQl9VUkxfUFJPUEVSVFkpOwotICAgIAlpZiAoIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIGRiVXJsKSkgewotICAgIAkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIE1JU1NJTkdfUFJPUEVSVFlfTUVTU0FHRSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGRiVXJsOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvZmlsZSgpIHsKLQotICAgIAlyZXR1cm4gdGhpcy5nZXRQcm9maWxlTmFtZWQoIHRoaXMucHJvZmlsZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGdldFByb2ZpbGVOYW1lZCggU3RyaW5nIHByb2ZpbGVOYW1lKSB7Ci0gICAgCQotICAgIAlyZXR1cm4gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCkucHJvZmlsZU5hbWVkKCBwcm9maWxlTmFtZSk7Ci0gICAgfQotICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGVzdFBsdWdpbkJ1bmRsZUlkKCkgewotCQlyZXR1cm4gSnB0RGJUZXN0c1BsdWdpbi5CVU5ETEVfSUQ7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXREcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSB7Ci0JCXJldHVybiBDb25uZWN0aXZpdHlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uZmlnUGF0aCgpIHsKLSAgICAJcmV0dXJuIHRoaXMuZ2V0Q29uZmlnRGlyKCkgKyAiLyIgKyB0aGlzLmdldENvbmZpZ05hbWUoKTsKLSAgICB9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uZmlnRGlyKCkgewotICAgIAlyZXR1cm4gUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWTsKLSAgICB9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGxhdGZvcm1Jc05ldygpIHsKLQkJcmV0dXJuKCAhdGhpcy5kYXRhYmFzZVZlbmRvcigpLmVxdWFscyggdGhpcy5jdXJyZW50RGJWZW5kb3IpIHx8IHRoaXMuZGF0YWJhc2VWZXJzaW9uKCkuZXF1YWxzKCB0aGlzLmN1cnJlbnREYlZlcnNpb24pKTsKLQl9Ci0JCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRQbGF0Zm9ybVByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkKLQkJaWYoIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCVVSTCBjb25maWdVcmwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIHRoaXMuZ2V0VGVzdFBsdWdpbkJ1bmRsZUlkKCkpLmdldEVudHJ5KCB0aGlzLmdldENvbmZpZ1BhdGgoKSk7Ci0KLQkJCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmxvYWQoIGNvbmZpZ1VybC5vcGVuU3RyZWFtKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydGllcyBidWlsZERyaXZlclByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgZHJpdmVyUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5EUklWRVJfREVGSU5JVElPTl9UWVBFX1BST1BfSUQsIHRoaXMuZHJpdmVyRGVmaW5pdGlvblR5cGUoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5EUklWRVJfSkFSX0xJU1RfUFJPUF9JRCwgdGhpcy5kYXRhYmFzZWRyaXZlckphckxpc3QoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVNFUk5BTUVfUFJPUF9JRCwgdGhpcy51c2VyTmFtZSgpKTsKLQkJZHJpdmVyUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCwgdGhpcy5kcml2ZXJDbGFzcygpKTsKLQkJZHJpdmVyUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQsIHRoaXMuZGF0YWJhc2VOYW1lKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQsIHRoaXMudXNlclBhc3N3b3JkKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVXJsKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVmVuZG9yKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCwgdGhpcy5kYXRhYmFzZVZlcnNpb24oKSk7Ci0JCXJldHVybiBkcml2ZXJQcm9wZXJ0aWVzOwotCX0KLQotCXByaXZhdGUgUHJvcGVydGllcyBidWlsZEJhc2ljUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBiYXNpY1Byb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfTkFNRV9QUk9QX0lELCB0aGlzLmRhdGFiYXNlTmFtZSgpKTsKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMudXNlck5hbWUoKSk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lELCB0aGlzLnVzZXJQYXNzd29yZCgpKTsKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCwgdGhpcy5kcml2ZXJEZWZpbml0aW9uSWQoKSk7Ci0JCQotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQsIHRoaXMuZHJpdmVyQ2xhc3MoKSk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5kYXRhYmFzZVVybCgpKTsKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVmVuZG9yKCkpOwotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVmVyc2lvbigpKTsKLQkJCi0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLkRBVEFCQVNFX1NBVkVfUFdEX1BST1BfSUQsIHRoaXMucGFzc3dvcmRJc1NhdmVkKCkpOwotCQlyZXR1cm4gYmFzaWNQcm9wZXJ0aWVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbm5lY3Rpb25Qcm9maWxlKCBTdHJpbmcgcHJvZmlsZU5hbWUpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCQotCQlQcm9maWxlTWFuYWdlciBwcm9maWxlTWFuYWdlciA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCBwcm9maWxlTWFuYWdlcik7Ci0JCUlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gcHJvZmlsZU1hbmFnZXIuZ2V0UHJvZmlsZUJ5TmFtZSggcHJvZmlsZU5hbWUpOwotCQlpZiggcHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlQcm9wZXJ0aWVzIGJhc2ljUHJvcGVydGllcyA9IGJ1aWxkQmFzaWNQcm9wZXJ0aWVzKCk7Ci0JCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZVByb2ZpbGUoIHByb2ZpbGVOYW1lLCB0aGlzLnByb2ZpbGVEZXNjcmlwdGlvbigpLCB0aGlzLnByb3ZpZGVySWQoKSwgYmFzaWNQcm9wZXJ0aWVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZERyaXZlckRlZmluaXRpb25GaWxlKCBTdHJpbmcgZHJpdmVyRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVhNTEZpbGVNYW5hZ2VyLnNldFN0b3JhZ2VMb2NhdGlvbiggdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSk7Ci0JCVhNTEZpbGVNYW5hZ2VyLnNldEZpbGVOYW1lKCBkcml2ZXJGaWxlTmFtZSk7Ci0JCUlQcm9wZXJ0eVNldFtdIHByb3BzZXRzID0gbmV3IElQcm9wZXJ0eVNldFsgMV07Ci0JCVN0cmluZyBkcml2ZXJOYW1lID0gdGhpcy5kcml2ZXJOYW1lKCk7Ci0JCVN0cmluZyBkcml2ZXJJZCA9IHRoaXMuZHJpdmVyRGVmaW5pdGlvbklkKCk7Ci0JCVByb3BlcnR5U2V0SW1wbCBwcm9wZXJ0eVNldCA9IG5ldyBQcm9wZXJ0eVNldEltcGwoIGRyaXZlck5hbWUsIGRyaXZlcklkKTsKLQkJcHJvcGVydHlTZXQuc2V0UHJvcGVydGllcyggZHJpdmVySWQsIHRoaXMuYnVpbGREcml2ZXJQcm9wZXJ0aWVzKCkpOwotCQlwcm9wc2V0c1sgMF0gPSBwcm9wZXJ0eVNldDsKLQotCQlYTUxGaWxlTWFuYWdlci5zYXZlTmFtZWRQcm9wZXJ0eVNldCggcHJvcHNldHMpOwotCQkKLQkJRmlsZSBkcml2ZXJEZWZpbml0aW9uZUZpbGUgPSAgdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKS5hcHBlbmQoIGRyaXZlckZpbGVOYW1lKS50b0ZpbGUoKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIGRyaXZlckRlZmluaXRpb25lRmlsZS5leGlzdHMoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EZXJieTEwMVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5MTAxVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1MTBjZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5MTAxVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogIERlcmJ5IDEwLjEgRW1iZWRkZWQgRHJpdmVyIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIERlcmJ5MTAxVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLm1haW4oIG5ldyBTdHJpbmdbXSB7ICItYyIsIERlcmJ5MTAxVGVzdHMuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggRGVyYnkxMDFUZXN0cy5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZXJieTEwMVRlc3RzKCBTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlciggbmFtZSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZW5kb3IoKSB7Ci0gICAgICAgIHJldHVybiAiRGVyYnkiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gIjEwLjEiOwotICAgIH0KLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVySWQoKSB7Ci0gICAgICAgIHJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5kZXJieS5lbWJlZGRlZC5jb25uZWN0aW9uUHJvZmlsZSI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJEZXJieSBFbWJlZGRlZCBKREJDIERyaXZlciI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5kZXJieTEwMS5nZW5lcmljRHJpdmVyVGVtcGxhdGUiOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuICJEcml2ZXJEZWZuLkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIiOwotICAgIH0KLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ05hbWUoKSB7Ci0gICAgCXJldHVybiAiZGVyYnkxMDEucHJvcGVydGllcyI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQzYTNkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogIE9yYWNsZSAxMGcgVGhpbiBEcml2ZXIgVGVzdAotICovCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbiggbmV3IFN0cmluZ1tdIHsgIi1jIiwgT3JhY2xlMTBnVGVzdHMuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggT3JhY2xlMTBnVGVzdHMuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT3JhY2xlMTBnVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25JZCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgIAlyZXR1cm4gIm9yYWNsZTEwZy5wcm9wZXJ0aWVzIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTlpVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzMDgxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiAgT3JhY2xlIDlpIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIE9yYWNsZTlpVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbiggbmV3IFN0cmluZ1tdIHsgIi1jIiwgT3JhY2xlOWlUZXN0cy5jbGFzcy5nZXROYW1lKCl9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBPcmFjbGU5aVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9yYWNsZTlpVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOSI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvbklkKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uT3JhY2xlIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS45LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDlpIFRoaW4gRHJpdmVyIjsKLQl9Ci0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgIAlyZXR1cm4gIm9yYWNsZTlpLnByb3BlcnRpZXMiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyMjAwNVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlcjIwMDVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY1MDM0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyMjAwNVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi0vKioKLSAqICBTUUwgU2VydmVyIDIwMDUgRHJpdmVyIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIFNRTFNlcnZlcjIwMDVUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbiggbmV3IFN0cmluZ1tdIHsgIi1jIiwgU1FMU2VydmVyMjAwNVRlc3RzLmNsYXNzLmdldE5hbWUoKX0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIFNRTFNlcnZlcjIwMDVUZXN0cy5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTUUxTZXJ2ZXIyMDA1VGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlbmRvcigpIHsKLSAgICAgICAgcmV0dXJuICJTUUxTZXJ2ZXIiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gIjIwMDUiOwotICAgIH0KLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVySWQoKSB7Ci0gICAgICAgIHJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gIk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBEcml2ZXIiOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm1zZnQuc3Fsc2VydmVyLjIwMDUuZHJpdmVyVGVtcGxhdGUiOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuICJEcml2ZXJEZWZuLk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBEcml2ZXIiOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckNsYXNzKCkgewotICAgICAgICByZXR1cm4gImNvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyIjsKLSAgICB9Ci0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotICAgIAlyZXR1cm4gInNxbHNlcnZlcjIwMDUucHJvcGVydGllcyI7Ci0gICAgfQotfQo=